Каталог решений - Пример преобразования двоичных данных в строку

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

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

В наличии

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

Категория:

Описание

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

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

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

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

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

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

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

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

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

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

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

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

has been added to your cart:
Оформление заказа