Имя: Пароль:
1C
 
Конвертация из 16 ричной системы в двоичную
,
0 Лентаf
 
09.06.22
14:47
Нашел сайтик конвертации
Hex to Binary converter
https://www.rapidtables.com/convert/number/hex-to-binary.html
Почему когда конвертируешь из 16ричной в двоичную и из 16 ричной в 10ю и потом в двоичную разные результаты?

Как в 1с написать конвертацию из 16 ричной системы в двоичную?
1 yopQua
 
09.06.22
14:48
из 10 в 16 в гугле
аналогично двочиная
2 asady
 
09.06.22
14:48
(0) сам напиши
3 Ryzeman
 
09.06.22
14:48
>>Как в 1с написать конвертацию из 16 ричной системы в двоичную?

Дожили) Программист с 6летним стажем (на мисте по крайней мере)
4 Krendel
 
09.06.22
14:49
(0) Видимо всем пофигу, в т.ч. и разработчику сайта
5 asady
 
09.06.22
14:49
16-ти ричное число = 4 бита - полубайт

отсюда и пляши
6 Лентаf
 
09.06.22
14:49
(2) а как?
7 Ryzeman
 
09.06.22
14:49
(0) ProTip: калькулятор винды умеет переводить если тебе просто надо пару чисел проверить.
8 Лентаf
 
09.06.22
14:49
Число в шестнадцатеричной системе счисления состоит из цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F (где A, B, C, D, E и F равны 10, 11, 12, 13, 14 и 15 соответственно).

Например 5B09F3 — это число в шестнадцатеричной системе счисления.

Для перевода числа из шестнадцатеричной системы счисления в двоичную систему необходимо каждую цифру шестнадцатеричного числа заменить соответствующей ей тетрадой (4 бита) из таблицы перевода, приведенной ниже.

Перевод из шестнадцатеричной в двоичную систему счисления на Си - vscode.ru

Приведем пример. Переведем число A50E7 в двоичную систему счисления. Для этого заменим каждую его цифру соответствующей ей тетрадой из таблицы перевода.

A50E7(16) = 10100101000011100111(2). Для удобочитаемости разные тетрады выделены разным начертанием шрифта.
9 Лентаf
 
09.06.22
14:50
(7) мне надо на 1с
10 asady
 
09.06.22
14:50
(5) ну ты понял не 16-ричное число а 16-ричная цифра = 0-9, A-F
11 Krendel
 
09.06.22
14:51
(9) Тебе тз написать?
12 yopQua
 
09.06.22
14:52
что за проблема, 100 раз уже это написали
13 Ryzeman
 
09.06.22
14:54
(9) ну так (2)
Это мало того, что задачка 7го класса на третьем уроке по информатике, так и просто первая ссылка гугла, если ты настолько ленив ><
14 yopQua
 
09.06.22
14:55
он настолько ленив, что лениться ему лень
15 Chai Nic
 
09.06.22
14:56
(13) Можно обратиться в фирму 1с, чтобы они в очередном релизе платформы включили функции по преобразованию систем счислений для чисел, предоставленных строкой. Ведь сделали же функции ЧислоИзДвоичнойСтроки и ЧислоИзШестнадцатеричнойСтроки. Что им мешает?)
16 banco
 
09.06.22
14:56
Функция ПреобразоватьДесятичноеЧислоВШестнадцатиричнуюСистемуСчисления(Знач ДесятичноеЧисло)
    
    Результат = "";
    
    Пока ДесятичноеЧисло > 0 цикл
        ОстатокОтДеления = ДесятичноеЧисло % 16;
        ДесятичноеЧисло  = (ДесятичноеЧисло - ОстатокОтДеления) / 16;
        Результат        = Сред("0123456789abcdef", ОстатокОтДеления + 1, 1) + Результат;
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции

Функция ПреобразоватьИзШестнадцатиричнойСистемыСчисленияВДесятичноеЧисло(Знач Значение)
    
    Значение = НРег(Значение);
    ДлинаСтроки = СтрДлина(Значение);
    
    Результат = 0;
    Для НомерСимвола = 1 По ДлинаСтроки Цикл
        Результат = Результат * 16 + Найти("0123456789abcdef", Сред(Значение, НомерСимвола, 1)) - 1;
    КонецЦикла;
    
    Возврат Формат(Результат, "ЧГ=0");
    
КонецФункции
17 Лентаf
 
09.06.22
15:08
Функция ШестнадцатиричноеВДвоичное(Знач Стр2) Экспорт
    
    Стр = СокрЛП(Стр2);
    Рез="";
    
    Для н=1 по СтрДлина(Стр) Цикл
        Буква = Сред(Стр,н,1);
        Если Буква = "0" Тогда
            Рез=Рез+"0000";
        ИначеЕсли Буква = "1" Тогда
            Рез=Рез+"0001";
        ИначеЕсли Буква = "2" Тогда
            Рез=Рез+"0010";
        ИначеЕсли Буква = "3" Тогда
            Рез=Рез+"0011";
        ИначеЕсли Буква = "4" Тогда
            Рез=Рез+"0100";
        ИначеЕсли Буква = "5" Тогда
            Рез=Рез+"0101";
        ИначеЕсли Буква = "6" Тогда
            Рез=Рез+"0110";
        ИначеЕсли Буква = "7" Тогда
            Рез=Рез+"0111";
        ИначеЕсли Буква = "8" Тогда
            Рез=Рез+"1000";
        ИначеЕсли Буква = "9" Тогда
            Рез=Рез+"1001";
        ИначеЕсли Буква = "A" Тогда
            Рез=Рез+"1010";
        ИначеЕсли Буква = "B" Тогда
            Рез=Рез+"1011";
        ИначеЕсли Буква = "C" Тогда
            Рез=Рез+"1100";
        ИначеЕсли Буква = "D" Тогда
            Рез=Рез+"1101";
        ИначеЕсли Буква = "E" Тогда
            Рез=Рез+"1110";
        ИначеЕсли Буква = "F" Тогда
            Рез=Рез+"1111";
        Иначе
            Сообщить("ошибка!");
        КонецЕсли;
        //Рез=Рез+Число(Сред(Стр,н,1));
    КонецЦикла;
    
    Возврат Рез;
    
КонецФункции  

Я вот тут написал, но мне кажется я что-то не учел: длина бинарного значения больше чем в калькуляторе.
18 Ryzeman
 
09.06.22
15:11
(17) используй (16) уже... Добавь параметром основание и получишь универсальную функцию, хоть в двоичную, хоть в троичную, хоть в 16ричную.
19 asady
 
09.06.22
15:11
function HexToBinary(strHexValue)
Hex = new Map;
Hex.insert("0","0000");
Hex.insert("1","0001");
Hex.insert("2","0010");
Hex.insert("3","0011");
Hex.insert("4","0100");
Hex.insert("5","0101");
Hex.insert("6","0110");
Hex.insert("7","0111");
Hex.insert("8","1000");
Hex.insert("9","1001");
Hex.insert("A","1010");
Hex.insert("B","1011");
Hex.insert("C","1100");
Hex.insert("D","1101");
Hex.insert("E","1110");
Hex.insert("F","1111");
num = strlen(strHexValue);
res = "";
for i=1 to num do
bin = Hex.get(Upper(mid(strHexValue,i,1)));
if bin = undefined then
    res = "";
    break;
endif;
res = bin + res;
enddo;
return res;
endfunction
20 asady
 
09.06.22
15:13
(19)+
oops...

res = res + bin;
21 Лентаf
 
09.06.22
15:14
(19) это язык 1с?
22 yopQua
 
09.06.22
15:17
(21) ну да
23 yopQua
 
09.06.22
15:17
а что не так?
24 Gary417
 
09.06.22
15:18
(9) а зачем? ты хочешь установленные биты узнавать? это надо другим способом делать
25 Лентаf
 
09.06.22
15:19
(18) у меня были 2 функции

Функция Из_Любой_В_10(Знач Значение="0",Нотация=36) Экспорт
     Если Нотация<=0 Тогда Возврат(0) КонецЕсли;
     Значение=СокрЛП(Значение);
     Если Значение="0" Тогда Возврат(0) КонецЕсли;
     Результат=0;
     Длина=СтрДлина(Значение);
     Для Х=1 По Длина Цикл
          М=1;
          Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла;
          Результат=Результат+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Значение,Х,1))-1)*М;
     КонецЦикла;
     Возврат Окр(Результат);
КонецФункции

Функция Из_10_В_Любую(Знач Значение=0,Нотация=36) Экспорт
     Если Нотация<=0 Тогда Возврат("") КонецЕсли;
     Значение=Число(Значение);
     Если Значение<=0 Тогда Возврат("0") КонецЕсли;
     Значение=Цел(Значение);
     Результат="";
     Пока Значение>0 Цикл
          Результат=Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Значение%Нотация+1,1)+Результат;
          Значение=Цел(Значение/Нотация) ;
     КонецЦикла;
     Возврат Результат;
КонецФункции


проблема в том, что когда переводишь из 16ричн в двоичную приходится сначала из 16рич в 10тичн потом в двоичн, а это не равно из шестнадцатиричной в двоичную.
26 Gary417
 
09.06.22
15:19
(25) пример напиши какие числа не получаются
27 Garykom
 
гуру
09.06.22
15:19
(25) ыыы
28 Chai Nic
 
09.06.22
15:20
"когда переводишь из 16ричн в двоичную приходится сначала из 16рич в 10тичн потом в двоичн, а это не равно из шестнадцатиричной в двоичную"
Вы открыли новое слово в арифметике. В Академию Наук уже писали?
29 hhhh
 
09.06.22
15:20
(17) и чего, не работает?
30 DES
 
09.06.22
15:21
(25) Покажи примеры значение и результат. Пожалуйста!
31 Ryzeman
 
09.06.22
15:22
(25) Это к вопросу "Вам шашечки или ехать"?

Ты в принципе ограничен тем, что у тебя 1с как платформа умеет производить арифметические действия в десятеричной системе счисления. Можно бы было делить двоичные или другие числа - можно было бы написать нормальный алгоритм без промежуточного перевода из-в десятиричную.

(17) Этот изврат ничем не лучше.
32 Garykom
 
гуру
09.06.22
15:28
(31) "1с как платформа умеет производить арифметические действия в десятеричной системе счисления"
муахаха
33 asady
 
09.06.22
15:29
34 Лентаf
 
09.06.22
15:30
(31) а как решить следующую задачу: Есть код из 128 символов,

00111011100011000111001000111010011111100011010110101111010000000010001101111100010000101010101000000100100010101000111110011100

он в двоичной системе, тебе надо его перевести в шестнадцатиричную систему
юзаю калькулятор
https://www.rapidtables.com/convert/number/decimal-to-binary.html

перевел в 2ичн:
000100010001000000010001000100000000000000010001000000000000000100010001000000000001000000000000000100010001000000010000000000010001000100010001000100000000000000010001000000010000000100010000000100000001000100010001000000010000000000000000000000000000000000010000000000000001000100000001000100010001000100000000000000010000000000000000000100000001000000010000000100000001000000000000000000000000000100000000000100000000000000010000000100000001000000000000000100010001000100010000000000010001000100000000

и в 10тичн:
3490817467789548012842093518532199172189570495389545465683046220553146356736125986424954194314627622297852127103631343854361896708588849667207155749120

Теперь пробую перевести из 10тичн в двоичн (для проверки)
100010001000000010001000100000000000000010001000000000000000100010001000000000001000000000000000100010001000000010000000000010001000100010001000100000000000000010001000000010000000100010000000100000001000100010001000000010000000000000000000000000000000000010000000000000001000100000001000100010001000100000000000000010000000000000000000100000001000000010000000100000001000000000000000000000000000100000000000100000000000000010000000100000001000000000000000100010001000100010000000000010001000100000000

итог не равен, почему так?
35 Chai Nic
 
09.06.22
15:35
(34) Вы похоже своими мегачислами переполнили буфер у этого конвертора)
36 Gary417
 
09.06.22
15:35
(34) <итог не равен, почему так?>
ты не заметил что
000100010001000000010001000100000000000000010001000000000000000100010001000000000001000000000000000100010001000000010000000000010001000100010001000100000000000000010001000000010000000100010000000100000001000100010001000000010000000000000000000000000000000000010000000000000001000100000001000100010001000100000000000000010000000000000000000100000001000000010000000100000001000000000000000000000000000100000000000100000000000000010000000100000001000000000000000100010001000100010000000000010001000100000000

и

100010001000000010001000100000000000000010001000000000000000100010001000000000001000000000000000100010001000000010000000000010001000100010001000100000000000000010001000000010000000100010000000100000001000100010001000000010000000000000000000000000000000000010000000000000001000100000001000100010001000100000000000000010000000000000000000100000001000000010000000100000001000000000000000000000000000100000000000100000000000000010000000100000001000000000000000100010001000100010000000000010001000100000000


на самом деле одно и тоже?
37 Gary417
 
09.06.22
15:35
во втором номере у тебя просто трех лидирующих нулей нет
38 Gary417
 
09.06.22
15:37
тебе надо просто добавлять нули впереди до требуемой длинны
39 Лентаf
 
09.06.22
15:39
(37) в том то и дело, надо чтобы не обрезало.
40 Garykom
 
гуру
09.06.22
15:39
(37) он меня этим добил
41 Garykom
 
гуру
09.06.22
15:40
(39) ну так напиши свой калькулятор "чтобы не обрезало"
42 Garykom
 
гуру
09.06.22
15:40
а то ведь сложно понять что число 1, 01, 001 и т.д. это тоже самое ))
43 Ryzeman
 
09.06.22
15:41
(32) в 1с можно троичное число поделить на другое? Мне правда интересно, просвети, пожалуйста.
44 Йохохо
 
09.06.22
15:44
(43) логарифм есть, дели
(0) решать примеры сайта который путает хекс и хексадецимал такое себе
45 Krendel
 
09.06.22
15:56
(42) веселее когда он сравнивает 100 и 001
46 vbus
 
09.06.22
16:25
Я сосчитал
bx00111011100011000111001000111010011111100011010110101111010000000010001101111100010000101010101000000100100010101000111110011100=
hx3B8C723A7E35AF40237C42AA048A8F9C
47 DES
 
09.06.22
17:02
(34) берешь код, режешь с конца по 4 символа и кодируешь своей кодировклй и складываешь строку слева
48 NorthWind
 
09.06.22
19:54
(44) > решать примеры сайта который путает хекс и хексадецимал такое себе
а первое не есть сокращение от второго?
49 NorthWind
 
09.06.22
19:57
Так-то я отдаю себе отчет, что слова hex и hexadecimal в английском языке означают разное. Но в контексте, даже в литературе, не говоря уже про компьютерный сленг, hex обычно используется именно как сокращение от hexadecimal.
50 ДедМорроз
 
09.06.22
21:14
Во-первых,нужно не забывать отбрасывать нули в начале полученного числа,так как иначе у вас 1в начале переводится в 0001.
Во-вторых,обратный перевод нужно начинать с конца,отсчитывая по 4 двоичных цифры,а если их меньше,то заменять старшие нулями.
Во-вторых,никакой десятичной системы у нас нет,пока мы не выводим число,так как внутреннее представление числа явно не десятичное.
51 Bigbro
 
10.06.22
04:25
"Почему когда конвертируешь из 16ричной в двоичную и из 16 ричной в 10ю и потом в двоичную разные результаты?"
потому что писали такие же как ты двоечники.
что за позор блин..
ну в школе же на информатике еще изучают системы счисления.
и эти люди потом занимаются автоматизацией.. (
52 NorthWind
 
10.06.22
07:22
(0) из 16 в 2 совсем просто. Каждый символ от 0 до F заменяешь последовательностью 0000,0001,0010,0011,0100 и так до 1111. Можно по предварительно составленной табличке.
53 Garykom
 
гуру
10.06.22
08:59
(52) любые кратные системы-основания просто