Глобальный контекст.РазделитьДвоичныеДанные

Методы · SplitBinaryData

Разделяет двоичные данные на части заданного размера. Размер задается в байтах.

Синтаксис

РазделитьДвоичныеДанные(<ДвоичныеДанные>, <РазмерЧасти>)
Полное описание, параметры и ограничения

Глобальный контекст.РазделитьДвоичныеДанные (Global context.SplitBinaryData)

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

РазделитьДвоичныеДанные (SplitBinaryData)

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

Синтаксис:
РазделитьДвоичныеДанные(<ДвоичныеДанные>, <РазмерЧасти>)
Параметры:

<ДвоичныеДанные> (обязательный)
Тип: ДвоичныеДанные.
Объект типа ДвоичныеДанные.

<РазмерЧасти> (обязательный)
Тип: Число.
Размер одной части данных.
Возвращаемое значение:
Тип: Массив.
Массив объектов типа ДвоичныеДанные.
Описание:

Разделяет двоичные данные на части заданного размера. Размер задается в байтах.

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

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

См. также:
Глобальный контекст, метод РазделитьФайл

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

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

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

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

Разделить двоичные данные на части и восстановить исходные байты

Строку Книга превращаем в 10 байт UTF-8, делим по 4 байта и собираем обратно. Не пытаемся декодировать каждый фрагмент как отдельную строку.

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

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

Подготовка

  1. Весь пример выполняется на числах, строках и двоичных данных, созданных в памяти. Реальные файлы, API и объекты базы не нужны.


Данные = ПолучитьДвоичныеДанныеИзСтроки("Книга", КодировкаТекста.UTF8, Ложь);
Части = РазделитьДвоичныеДанные(Данные, 4);
Если Данные.Размер() <> 10 Или Части.Количество() <> 3 Тогда
    ВызватьИсключение "Неверно подготовлены учебные UTF-8 данные";
КонецЕсли;
Если Части[0].Размер() <> 4 Или Части[1].Размер() <> 4 Или Части[2].Размер() <> 2 Тогда
    ВызватьИсключение "Ожидались части 4, 4 и 2 байта";
КонецЕсли;
Восстановлено = СоединитьДвоичныеДанные(Части);
Если ПолучитьHexСтрокуИзДвоичныхДанных(Восстановлено) <> ПолучитьHexСтрокуИзДвоичныхДанных(Данные) Тогда
    ВызватьИсключение "Байты после сборки отличаются";
КонецЕсли;
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Восстановлено, КодировкаТекста.UTF8));
ЧастиБуфера = Новый Массив;
Для Каждого Часть Из Части Цикл
    ЧастиБуфера.Добавить(ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Часть));
КонецЦикла;
Буфер = СоединитьБуферыДвоичныхДанных(ЧастиБуфера);
ИзБуфера = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Буфер);
Сообщить(ПолучитьHexСтрокуИзДвоичныхДанных(ИзБуфера) = ПолучитьHexСтрокуИзДвоичныхДанных(Данные));

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

  1. UTF-8 без BOM даёт для пяти кириллических букв десять байт. Размер части измеряется в байтах, не в символах.

  2. РазделитьДвоичныеДанные возвращает массив отдельных ДвоичныхДанных. Последний фрагмент может быть меньше заданного размера.

  3. СоединитьДвоичныеДанные сохраняет порядок переданного массива. Сравниваем точные байты через hex, а не только отображаемую строку.

  4. Для буферов используется отдельный СоединитьБуферыДвоичныхДанных. В этом упражнении разделитель не вставляем.

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

  1. Части имеют размеры 4, 4 и 2; после сборки выводится Книга.

  2. Последнее сравнение для пути через буферы даёт Истина.

  3. Попробуйте размер части 3 в отдельной копии, обновив проверки размеров: фрагмент может разрезать UTF-8 символ, но сборка исходных байтов остаётся возможной.

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

Двоичные фрагменты собраны двумя API с сохранением исходного UTF-8 текста.

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

  1. Декодирование произвольной части может повредить символ, если граница проходит внутри его UTF-8 последовательности.

  2. Много частей и одновременное хранение копий расходуют память. Это упражнение на 10 байт, не алгоритм для многогигабайтных файлов.

  3. Части не содержат контрольной суммы или номера автоматически; для передачи по сети эти поля нужно проектировать отдельно.

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

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

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

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

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