Глобальный контекст.ПолучитьСтрокуИзБуфераДвоичныхДанных

Методы · GetStringFromBinaryDataBuffer

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

Синтаксис

ПолучитьСтрокуИзБуфераДвоичныхДанных(<Буфер>, <КодировкаТекста>)
Полное описание, параметры и ограничения

Глобальный контекст.ПолучитьСтрокуИзБуфераДвоичныхДанных (Global context.GetStringFromBinaryDataBuffer)

Глобальный контекст (Global context)

ПолучитьСтрокуИзБуфераДвоичныхДанных (GetStringFromBinaryDataBuffer)

Доступен, начиная с версии 8.3.10.

Синтаксис:
ПолучитьСтрокуИзБуфераДвоичныхДанных(<Буфер>, <КодировкаТекста>)
Параметры:

<Буфер> (обязательный)
Тип: БуферДвоичныхДанных.
Буфер двоичных данных, который требуется преобразовать в строку.

<КодировкаТекста> (необязательный)
Тип: КодировкаТекста, Строка.
Кодировка текста может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки.
Поддерживаемые названия кодировок:
UTF-8

UTF-16

UTF-16BE

UTF-16LE

ISO-8859-1

US-ASCII

gb18030

iso-8859-2

iso-8859-3

iso-8859-4

iso-8859-5

iso-8859-6

iso-8859-7

iso-8859-8

iso-8859-9

iso-8859-13

iso-8859-15

Shift_JIS

EUC-JP

Big5

Big5-HKSCS

GBK

GB2312

GB_2312-80

EUC-KR

KSC_5601

windows-949

windows-874

cp866

KOI8-R

KOI8-U

windows-1250

windows-1251

windows-1252

windows-1253

windows-1254

windows-1255

windows-1256

windows-1257

windows-1258

macintosh

x-mac-cyrillic

ISO-2022-JP

ISO-2022-KR

ISO-2022-CN

ISO-2022-CN-EXT

HZ-GB-2312
.
Значение по умолчанию: UTF8.
Возвращаемое значение:
Тип: Строка.

Описание:

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

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

Использование в версии:

Доступен, начиная с версии 8.3.10.

Методическая информация

Практические примеры

Передать байты как Base64 или показать их в Hex

Для JSON удобно строковое Base64, для диагностики — Hex. Отдельно демонстрируем варианты, где результат хранится буфером или двоичными данными.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Серверный контекст. Учебная строка abc кодируется в UTF-8 без BOM.

  2. В примере стандартное Base64, не вариант base64url для URL или токенов.

Данные = ПолучитьДвоичныеДанныеИзСтроки("abc", КодировкаТекста.UTF8, Ложь);
Буфер = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Данные);
Base64Текст = ПолучитьBase64СтрокуИзДвоичныхДанных(Данные);
HexТекст = ПолучитьHexСтрокуИзБуфераДвоичныхДанных(Буфер);
Сообщить(Base64Текст);
Сообщить(HexТекст);
ИзBase64 = ПолучитьДвоичныеДанныеИзBase64Строки(Base64Текст);
ИзHex = ПолучитьБуферДвоичныхДанныхИзHexСтроки(HexТекст);
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(ИзBase64, КодировкаТекста.UTF8));
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(ИзHex, КодировкаТекста.UTF8));
Base64Буфер = ПолучитьBase64БуферДвоичныхДанныхИзБуфераДвоичныхДанных(Буфер);
ВосстановленныйБуфер = ПолучитьБуферДвоичныхДанныхИзBase64БуфераДвоичныхДанных(Base64Буфер);
Base64Данные = ПолучитьBase64ДвоичныеДанныеИзДвоичныхДанных(Данные);
ВосстановленныеДанные = ПолучитьДвоичныеДанныеИзBase64ДвоичныхДанных(Base64Данные);
HexБуфер = ПолучитьHexБуферДвоичныхДанныхИзБуфераДвоичныхДанных(Буфер);
БуферПослеHex = ПолучитьБуферДвоичныхДанныхИзHexБуфераДвоичныхДанных(HexБуфер);
HexДанные = ПолучитьHexДвоичныеДанныеИзДвоичныхДанных(Данные);
ДанныеПослеHex = ПолучитьДвоичныеДанныеИзHexДвоичныхДанных(HexДанные);
Сообщить(ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(ВосстановленныйБуфер) = Base64Текст);
Сообщить(ПолучитьHexСтрокуИзДвоичныхДанных(ВосстановленныеДанные) = HexТекст);
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(БуферПослеHex, КодировкаТекста.UTF8));
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(ДанныеПослеHex, КодировкаТекста.UTF8));
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(HexТекст), КодировкаТекста.UTF8));
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(ПолучитьБуферДвоичныхДанныхИзBase64Строки(Base64Текст), КодировкаТекста.UTF8));
Сообщить(Base64Строка(Данные) = Base64Текст);
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(Base64Текст), КодировкаТекста.UTF8));

Разбор по шагам

  1. Получаем три байта abc и показываем строковые Base64 и Hex.

  2. Декодируем строковые представления и проверяем исходный текст.

  3. Буферные и двоичные варианты кодирования содержат символы кодированного представления, а не исходные три байта.

  4. Декодируем каждый вариант; Base64Строка и Base64Значение показывают старые краткие функции для двоичных данных.

Как проверить результат

  1. Base64 равно YWJj, Hex равно 616263.

  2. Все обратные преобразования выводят abc, сравнения представлений дают Истина.

  3. Не передавайте Hex-строку декодировщику Base64: это другой формат и другой смысл байтов.

Ожидаемый результат

Каждый показанный формат восстанавливает исходные байты при использовании парной функции.

На что обратить внимание

  1. Base64 не шифрует и не защищает данные: любой получатель может их восстановить.

  2. Двоичное содержимое Base64Данные — кодированное представление. Для HTTP-заголовка или JSON обычно нужна строковая функция.

  3. При работе с чужим API не заменяйте Base64 на base64url вручную без проверки его контракта.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Собрать пакет с версией, количеством и UTF-8 названием

Пакет имеет согласованную структуру: 1 байт версии, 2 байта количества, 4 байта длины названия, затем UTF-8. Проверяем поля до чтения тела.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Серверный контекст, только память. Это учебный протокол, не формат какого-либо реального API.

  2. Название кодируется в UTF-8 без BOM; целые записываются в LittleEndian.

  3. В конструктор записи и чтения передаётся уже созданный поток: его закрываем отдельно после закрытия обоих объектов.

Название = ПолучитьБуферДвоичныхДанныхИзСтроки("Книга", КодировкаТекста.UTF8, Ложь);
Поток = Новый ПотокВПамяти;
Попытка
    Запись = Новый ЗаписьДанных(Поток, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian);
    Попытка
        Запись.ЗаписатьБайт(1);
        Запись.ЗаписатьЦелое16(3);
        Запись.ЗаписатьЦелое32(Название.Размер);
        Запись.ЗаписатьБуферДвоичныхДанных(Название);
    Исключение
        Запись.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Запись.Закрыть();
    Сообщить(Поток.Размер());
    Поток.Перейти(0, ПозицияВПотоке.Начало);
    Чтение = Новый ЧтениеДанных(Поток, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian);
    Попытка
        Версия = Чтение.ПрочитатьБайт();
        Если Версия <> 1 Тогда
            ВызватьИсключение "Неподдерживаемая версия пакета";
        КонецЕсли;
        Количество = Чтение.ПрочитатьЦелое16();
        Длина = Чтение.ПрочитатьЦелое32();
        Если Количество = Неопределено Или Длина = Неопределено Тогда
            ВызватьИсключение "Заголовок пакета оборван";
        КонецЕсли;
        Если Длина < 0 Или Длина > 1024 Тогда
            ВызватьИсключение "Недопустимая длина названия";
        КонецЕсли;
        Результат = Чтение.Прочитать(Длина);
        Если Результат.Размер <> Длина Тогда
            ВызватьИсключение "Название получено не полностью";
        КонецЕсли;
        БуферНазвания = Результат.ПолучитьБуферДвоичныхДанных();
        Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(БуферНазвания, КодировкаТекста.UTF8));
        Сообщить(Количество);
        Сообщить(Результат.ПолучитьДвоичныеДанные().Размер());
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Чтение.Закрыть();
Исключение
    Поток.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Поток.Закрыть();

Разбор по шагам

  1. Записываем поля заголовка в фиксированном порядке и длину тела в байтах.

  2. Закрыть объекта записи сбрасывает её буферы, не закрывая переданный извне поток.

  3. Возвращаем позицию в начало и читаем поля в том же порядке и с тем же порядком байтов.

  4. Ограничиваем длину, проверяем фактический размер прочитанного тела и лишь затем декодируем название.

Как проверить результат

  1. Размер пакета 17 байтов: 1 + 2 + 4 + 10; результат Книга и количество 3.

  2. Замените записанную версию 1 на 2: чтение должно завершиться текстом Неподдерживаемая версия пакета.

  3. Укажите при записи длину 100 вместо фактических 10: должна сработать проверка неполного названия.

Ожидаемый результат

Пакет прочитан с проверкой версии, ограничением размера и контролем неполного тела.

На что обратить внимание

  1. Для сетевого потока частичное чтение может быть нормальным: в реальном сетевом протоколе собирайте тело циклом до нужного размера или завершения потока.

  2. Нельзя доверять длине из внешнего пакета без верхнего ограничения: иначе можно выделить чрезмерную память.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.