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

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

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

18.03.2024    2677    0    John_d    8    

55

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

12.02.2024    4613    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    3963    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8841    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2077    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16150    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

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

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

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

    // прочитаем двоичные данные в строку
    ТекстовыйДокумент = Новый ТекстовыйДокумент;
    ТекстовыйДокумент.Прочитать(ФайлДанных, "ISO-8859-1", "");
    ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
17. Synoecium 778 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 10 12.03.18 14:23 Сейчас в теме
21 век на дворе, а статья как никогда полезна оказалась.
В одночасье у людей по всей сети перестала запускаться буха. Причем именно падать. Вылетала на строке:
ОтпечатокHex = ПолучитьHexСтрокуИзДвоичныхДанных(Сертификат.Отпечаток); в общем модуле ПерсонализированныеПредложенияСервисовКлиент.
Причем в отладчике Отпечаток был обычными двоичными данными. В итоге заменил на ваш модуль.
Других путей решения найти не смог. Можно было удалить личные сертификаты пользователя, но это не вариант.

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

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

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

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

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

Описание:
Получает XML представление значения для помещения в текст элемента или значение атрибута XML.
XML представление зависит от типа значения:
...
* Ссылки - как XML представление уникального идентификатора ссылки;
* ХранилищеЗначения и ДвоичныеДанные - как строка в формате base64.
Bale; AnyaIT; +2 Ответить
22. Max777 1 19.04.22 19:41 Сейчас в теме
Спасибо большое, полезно!
23. user1457164 16.10.23 18:27 Сейчас в теме
поддерживая ) полезно ) пасип ) и вариантов накидали на все случаи жизни )
24. fixin 4252 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 4252 01.02.24 19:25 Сейчас в теме
(25) ну там упаковано в gzip, нужно распаковывать. не туда комментарий опубликовал, вот ссылка: https://infostart.ru/1c/tools/844121/
Оставьте свое сообщение