Пример преобразования двоичных данных в строку

08.12.17

Разработка - Универсальные функции

Доброго всем времени суток. Хочу поделиться маленьким решением маленькой проблемы. Думаю, будет интересно новичкам. Я не раз встречал на форумах вопрос: как преобразовать двоичные данные в строку? В частности, к примеру, частенько нужно получить хэш файла MD5 в текстовом виде, но как мы знаем 1С возвращает его в виде двоичных данных.

Самый простой пример, который я видел, это просто выполнить приведение типа двоичных данных к строке и удалить пробел:

СтрЗаменить(Строка(ДвоичныеДанные), " ", "");

Но проблема, на мой взгляд, в том, что если строковое представление двоичных данных в 1С изменится, то все может пойти не по плану, да и как-то не по христиански это...

После появления в 1С возможности работы с двоичными данными, я нашел для себя решение этой проблемы. Программного кода, конечно, очень много по сравнению с простым приведение типов, но зато этот метод должен работать правильно всегда. Итак, код функций:

Функция ДвоичныеДанныеВСтроку(ДвоичныеДанные) Экспорт
    Результат = "";
    ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные);
    Байт = ЧтениеДанных.ПрочитатьБайт();
    Пока Не Байт = Неопределено Цикл
        Результат = Результат + ЧислоDECtoHEX(Байт, 2);
        Байт = ЧтениеДанных.ПрочитатьБайт();
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Функция ЧислоDECtoHEX(ИсходноеЧисло, ДлинаВыравнивания = 0) Экспорт
    Результат = "";
    Значение = ИсходноеЧисло;
    Пока Значение > 0 Цикл 
        Результат = Сред("0123456789ABCDEF", (Значение % 16) + 1, 1) + Результат;
        Значение = Цел(Значение / 16);
    КонецЦикла;
    
    Результат = ?(Результат = "", "0", Результат);
    Возврат ?(ДлинаВыравнивания > 0, СтрДопЛ(Результат, ДлинаВыравнивания, "0"), Результат);
КонецФункции

Функция СтрДопЛ(ДополняемаяСтрока, ДлинаСтроки, СимволДополнения) Экспорт
    Результат = ДополняемаяСтрока;
    
    Пока СтрДлина(Результат) < ДлинаСтроки Цикл
        Результат = СимволДополнения + Результат;    
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Собственно пример использования:

Хэш = Новый ХешированиеДанных(ХешФункция.MD5);
Хэш.ДобавитьФайл("C:\File.bin");  
ДвоичныеДанные = Хэш.ХешСумма;

Результат = ДвоичныеДанныеВСтроку(ДвоичныеДанные);
Сообщить(Результат, СтатусСообщения.Информация);

Эх, если бы разработчики платформы еще сделали функцию преобразования десятичного числа в шестнадцатеричное, то программного кода было бы в несколько раз меньше. Вообще странный подход у разработчиков платформы к расширению функционала, они добавили новую функцию ЧислоИзШестнадцатеричнойСтроки, но, что их остановило сделать функцию обратного преобразования, к примеру ЧислоВШестнадцатеричнуюСтроку, непонятно...

Всем добра, спасибо за внимание!

Вступайте в нашу телеграмм-группу Инфостарт

Двоичные данные hex

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3729    Abysswalker    9    

45

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    6996    DeerCven    15    

59

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    50505    dimanich70    83    

170

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7460    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    63736    atdonya    31    

70

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9328    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. apic 15 08.12.17 16:57 Сейчас в теме
Спасибо, теперь знаю как читать байты
2. Armando 1402 08.12.17 20:29 Сейчас в теме
Наверняка Вы пользовались СП, но не дочитали до методов ПолучитьДвоичныеДанныеИзСтроки и ПолучитьСтрокуИзДвоичныхДанных.
johntish; user790708; Egovigor; shiaju; ЕСТЬNULL; HAMAZ; user645801_yyyuuu123q; BigB; +8 Ответить
4. frkbvfnjh 818 09.12.17 06:48 Сейчас в теме
Можете написать как решить данную задачу с помощью этих функций (ПолучитьДвоичныеДанныеИзСтроки и ПолучитьСтрокуИзДвоичныхДанных)? У меня что-то "думки" не хватает, буду благодарен.
8. Armando 1402 09.12.17 23:54 Сейчас в теме
(4) В данном случае подойдет метод ПолучитьHexСтрокуИзДвоичныхДанных
Хэш = Новый ХешированиеДанных(ХешФункция.MD5);
Хэш.ДобавитьФайл("C:\File.bin");  
ДвоичныеДанные = Хэш.ХешСумма;

Результат = ПолучитьHexСтрокуИзДвоичныхДанных(ДвоичныеДанные);
Сообщить(Результат, СтатусСообщения.Информация);
johntish; user790708; lostcay; KilloN; shiaju; user1447578; user645801_yyyuuu123q; ado163; axsebur; Mikhail_81; svilsa; pintov; mysm; Danil.Potapov; buddha667; user633364_seleznev.ua; kiruha; frkbvfnjh; +18 Ответить
10. frkbvfnjh 818 11.12.17 05:55 Сейчас в теме
(8) АААААААААААААААААА, Спасибо Бро!!! Не знал о таком! Не жалею, что сделал публикацию, 5 минут позора, зато узнал то, что давно мучило и не узнал бы никогда этих элементарных вещей.
user600203_7377360; johntish; ixijixi; I_train; user645801_yyyuuu123q; svilsa; kild; Danil.Potapov; +8 Ответить
5. bulpi 217 09.12.17 15:31 Сейчас в теме
(2)
Не нашел таких методов в СП. (8.3.9)
user645801_yyyuuu123q; +1 Ответить
14. Поручик 4602 13.12.17 02:54 Сейчас в теме
(9) 8.3.10 не везде есть. Некоторые наши заказчики счастливо работают на 8.3.8 и большего не надо.
frkbvfnjh; +1 Ответить
3. Поручик 4602 09.12.17 02:01 Сейчас в теме
А ещё меня удивляет на.. зачем возвращать хэш MD5 в виде двоичных данных. Это же касается серийного номера сертификата в соответствующей функции и некоторых других.
13. cool.vlad4 2 13.12.17 01:29 Сейчас в теме
(3) чтобы можно было с этими двоичными данными делать все что хочешь, если посмотришь как делают апи у всяких криптобиблиотек в частности, там все построено по принципу пайпа, ты можешь эти двоичные данные еще куда-нибудь запихнуть и не париться, принимает ли у тебя метод текстовое представление(скорее даже hex представление, о текстовом вообще молчу, поскольку это не комильфо по определению из-за кодировок), я именно поэтому в своей ВК делал возврат двоичных данных
6. bulpi 217 09.12.17 15:34 Сейчас в теме
Есть еще вариант :

ТипДвоичныеДанные = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "hexBinary");
ДвоичныеДанные = ФабрикаXDTO.Создать(ТипДвоичныеДанные,ХешSHA1.ХешСумма);
Возврат ДвоичныеДанные.ЛексическоеЗначение;
ixijixi; user790708; Detache; shiaju; axsebur; Exit_in; Yashazz; svilsa; HIVvich; mysm; Irwin; Danil.Potapov; pm74; caponid; saddy; IgKR; Strobe; Поручик; A_Max; frkbvfnjh; nporrep; +21 Ответить
11. frkbvfnjh 818 11.12.17 05:59 Сейчас в теме
(6) Это ваще бомба! От куда вы все это берете? С этим XDTO что только не делают, я видел даже регулярные выражения обрабатывают. Спасибо!
15. Поручик 4602 15.12.17 23:53 Сейчас в теме
(6) А я вот подумал и сделал в нашей конфе так же, на всякий случай. До того двоичные данные преобразовывал тупо строкой.
7. johnnyshut23 108 09.12.17 22:35 Сейчас в теме
Спасибо большое, полезно!
12. frkbvfnjh 818 11.12.17 06:00 Сейчас в теме
Всем огромное спасибо!
16. kuzyara 2228 18.12.17 05:06 Сейчас в теме
Строка(ДвоичныеДанные) - так делать нельзя, т.к. съедаются #13#10

    // прочитаем двоичные данные в строку
    ТекстовыйДокумент = Новый ТекстовыйДокумент;
    ТекстовыйДокумент.Прочитать(ФайлДанных, "ISO-8859-1", "");
    ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
17. Synoecium 792 27.02.18 06:24 Сейчас в теме
(16) а почему они будут съедаться, двоичные данные представляются строкой в base16 виде и все символы там печатные.
Например,
тест64 = "DQkIExA=";
Сообщить(Строка(Base64Значение(тест64 )));

выдаст
0D 09 08 13 10
что соответствует исходной строке
18. nacsa 27.02.18 14:44 Сейчас в теме
(17) да, я тоже не понял этого.
19. andr2510 11 12.03.18 14:23 Сейчас в теме
21 век на дворе, а статья как никогда полезна оказалась.
В одночасье у людей по всей сети перестала запускаться буха. Причем именно падать. Вылетала на строке:
ОтпечатокHex = ПолучитьHexСтрокуИзДвоичныхДанных(Сертификат.Отпечаток); в общем модуле ПерсонализированныеПредложенияСервисовКлиент.
Причем в отладчике Отпечаток был обычными двоичными данными. В итоге заменил на ваш модуль.
Других путей решения найти не смог. Можно было удалить личные сертификаты пользователя, но это не вариант.

Спасибо 1С-у. Шикарные функции в платформу встраивает.
user790708; user1373330; +2 Ответить
20. pavelkusov 21.01.20 11:39 Сейчас в теме
Очень странная статья. Какой смысл переводить шестнадцатеричный байт 30 в строку "30"? Его в "1" надо перевести.

В Один эсах я не программирую. Поэтому может и по лоховски написал. Однако, работает и ладно.

Функция ДвоичныеДанныеВСтроку(ДвоичныеДанные) Экспорт
Результат = "";
ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные);
Байт = ЧтениеДанных.ПрочитатьБайт();
Пока Не Байт = Неопределено Цикл
Результат = Результат + Символ(Байт);
Байт = ЧтениеДанных.ПрочитатьБайт();
КонецЦикла;

Возврат Результат;
КонецФункции
zabaluev; +1 Ответить
21. bforce 484 06.02.20 10:37 Сейчас в теме
Все забывают про удобную функцию XMLСтрока()

Возвращаемое значение:
Тип: Строка.

Описание:
Получает XML представление значения для помещения в текст элемента или значение атрибута XML.
XML представление зависит от типа значения:
...
* Ссылки - как XML представление уникального идентификатора ссылки;
* ХранилищеЗначения и ДвоичныеДанные - как строка в формате base64.
ixijixi; Bale; AnyaIT; +3 Ответить
22. Max777 1 19.04.22 19:41 Сейчас в теме
Спасибо большое, полезно!
23. user1457164 16.10.23 18:27 Сейчас в теме
поддерживая ) полезно ) пасип ) и вариантов накидали на все случаи жизни )
24. fixin 4324 29.01.24 16:43 Сейчас в теме
спасибо, с 1 декабря 2023 moysklad стал отдавать данные только в gzip.
Применил функцию успешно, только в концовочке добавил кодировку UTF-8 в явном виде:

	ЧтениеТекста=Новый ЧтениеТекста(КаталогВременныхФайлов+РазделительПутей+"body.json", "UTF-8");
	Текст=ЧтениеТекста.Прочитать();
	ЧтениеТекста.Закрыть();
	УдалитьФайлы(КаталогВременныхФайлов);
	Возврат Текст;	


А то возвращалось нечитаемо.

было бы неплохо, что если бы это был не gzip, он просто распаковывал как строку, чтобы не думать, в каких ответах возвращается строка, в каких gzip.

Подробнее в статье: https://geniy1s.ru/izmeneniya-v-api-moj-sklad-v-2024/
25. Sergik82 01.02.24 16:51 Сейчас в теме
(24) Я статью прочитал, но так и не понял что делать.

Ответ.ПолучитьТелоКакСтроку()


Выдает что-то типа:� �Yk�F�ݿB���jt����Ҥy�JKӇ�f�

Там было предложение получать: ДД = Ответ.ПолучитьТелоКакДвоичныеДанные();

А как дальше получить читабельный ответ от сервера?

Обработки по загрузке из моего склада писал сам, а вот здесь не пойму чего делать? Подсакажете куда хоть копать, как распаковать из gzip?
26. fixin 4324 01.02.24 19:25 Сейчас в теме
(25) ну там упаковано в gzip, нужно распаковывать. не туда комментарий опубликовал, вот ссылка: https://infostart.ru/1c/tools/844121/
27. e-rogov 6 14.07.24 11:06 Сейчас в теме
Функция ДвоичныеДанныеВСтроку(ДвоичныеДанные) Экспорт
    Ответ = Новый HTTPСервисОтвет(200); Ответ.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные);
    Возврат Ответ.ПолучитьТелоКакСтроку();
КонецФункции
28. frkbvfnjh 818 15.07.24 08:32 Сейчас в теме
(27) Это не то. Если ДвоичныеДанные будут содержать строковое значение, то ПолучитьТелоКакСтроку() вернет строковое значение, а нужно строковое представление двоичных данных, по сути 16-ое число в виде строки.
29. e-rogov 6 15.07.24 09:06 Сейчас в теме
(28)
Функция ДвоичныеДанныеТекстовоеПредставление(ДвоичныеДанные) Экспорт
    Возврат СтрЗаменить("0x" + ДвоичныеДанные, " ", " 0x");
КонецФункции
30. e-rogov 6 15.07.24 09:07 Сейчас в теме
(28) имелось в виду что в двоичных данных сохранен текст, как например в ХранилищеДанных
Для отправки сообщения требуется регистрация/авторизация