Имя: Пароль:
1C
 
Перевод из двоичной системы в шестнадцатиричную
0 1сПупс
 
01.08.22
16:36
хай, перевожу с помощью функций:

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

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


1. сначала из 2ичной в 10 потом из 10 в 16 ричную.
2. когда есть лидирующие нули, типа 00000001001000101000111101001100101011110101100001111010100000010111100101011100000100000010000101101111000011100101101000100001 этого на выходе 16ричное число имеет длину не 32 символа, а меньше.
Как это победить?
1 1сПупс
 
01.08.22
16:37
имею с двоичного числа выше такое 16ричное число: 1228F4CAF587A81795C10216F0E5A21
2 RomanYS
 
01.08.22
16:46
(0) каждые 4 двоичных разряда дают один шестнадцатиричный. Что ты побеждать собрался непонятно. Если нужны лидирующие нули - просто добавь их
3 1сПупс
 
01.08.22
16:47
(2) просто странно почему эти 2 функции дают не 32символьное 16ричное число а 31.
4 1сПупс
 
01.08.22
16:48
https://ru.wikipedia.org/wiki/Шестнадцатеричная_система_счисления#:~:text=Для%20перевода%20многозначного%20двоичного%20числа,0101%201010%200011%20%3D%205A3 по идее можно создать функцию, которая разделит двоичное число на тетрады, и по заданным значениям переводить число из двоичного в 16ричное, райт?
5 Garykom
 
гуру
01.08.22
16:49
(3) Чтобы это понять надо слегка подучить обычную математику
6 RomanYS
 
01.08.22
16:50
(3) так ты перевёл в Число (тип такой в 1с) - все лидирующие нули потерялись и это правильно
7 RomanYS
 
01.08.22
16:51
(4) так и переводи тетрадами без (десятичного) числа в промежутке
8 1сПупс
 
01.08.22
16:52
(5) тут скорее логика, первая тетрада из 4-х нулей (0000) должны преобразоваться в 0, а из этих функций 0 теряется, идет сразу вторая тетрада (0001), преобразующаяся в 1.
9 Garykom
 
гуру
01.08.22
16:52
(5)+ Для совсем непонимающих да еще со склерозом:

1. Двоичное число в виде строки "00000001..." в 10-чное число в виде числа даст "обнуление" лишних нулей впереди. Примерно как Число("01") = 1.
2. 10-чное число превращая в 16-ричное получим его без лишних нулей впереди

3. Если нужны нули то добавь их до нужного числа разрядов. Простым циклом.
10 Garykom
 
гуру
01.08.22
16:58
(9)+ Хотя в 1С можно обойтись Формат(Строка16, "ЧЦ=32; ЧВН=")
11 Garykom
 
гуру
01.08.22
17:00
(10) гм это я погорячился, это только для 2-чных сработает

походу в 1С нет функции дополнения для строк?
12 1Сергей
 
01.08.22
17:02
(11) Прав("00000000000000000000000000000000"+НЕХ, 32)
13 Fish
 
01.08.22
17:06
(11) В БСП есть СтроковыеФункцииКлиентСервер.ДополнитьСтроку
14 RomanYS
 
01.08.22
17:08
В платформе есть методы
ЧислоИзДвоичнойСтроки
ЧислоИзШестнадцатеричнойСтроки

обратных правда не нашёл
15 ДНН
 
01.08.22
17:12
(0)     Число10 = ЧислоИзДвоичнойСтроки("0b" + ТвоеЧислоВДвоичнойСС);
    Поток = Новый ПотокВПамяти();
    Запись = Новый ЗаписьДанных(Поток);
    Запись.ЗаписатьЦелое64(Число10, ПорядокБайтов.BigEndian);
    Запись.Закрыть();
    ДД = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    Hex = ПолучитьHexСтрокуИзДвоичныхДанных(ДД);
    Сообщить(Hex);
16 Garykom
 
гуру
01.08.22
17:13
(12) Количество "0" хорошо бы не константой
17 Garykom
 
гуру
01.08.22
17:42
(16)+ через Формат как раз прекрасно выйдет
18 Garykom
 
гуру
01.08.22
17:43
Прав(Формат(0, "ЧЦ=32; ЧВН=")+НЕХ, 32) ?
19 RomanYS
 
01.08.22
17:50
с 0 не выйдет, его представление должно задаваться явно. Всё равно велосипед понадобится)))
20 1сПупс
 
01.08.22
18:16
(15) (15) Недопустимое значение числа
{ВнешняяОбработка.ГенераторСидФразыBitcoin.Форма.Форма.Форма(44)}:    Запись.ЗаписатьЦелое64(Число10, ПорядокБайтов.BigEndian);
{ВнешняяОбработка.ГенераторСидФразыBitcoin.Форма.Форма.Форма(163)}:    Команда1НаСервере();

по причине:
Недопустимое значение числа
21 RomanYS
 
01.08.22
18:23
*(19) к (18)
выражение вернёт пустую строку (представление 0 по-умолчанию)
22 Гений 1С
 
гуру
01.08.22
19:17
Если че, у меня в библиотеке Функций были функции по конвертации в из