ЗаписьДанных.ЗаписатьЦелое64

Методы · WriteInt64

Записывает целое 16-битное число в целевой поток.

Синтаксис

ЗаписатьЦелое64(<Число>, <ПорядокБайтов>)
Полное описание, параметры и ограничения

ЗаписьДанных.ЗаписатьЦелое64 (DataWriter.WriteInt64)

ЗаписьДанных (DataWriter)

ЗаписатьЦелое64 (WriteInt64)

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

Синтаксис:
ЗаписатьЦелое64(<Число>, <ПорядокБайтов>)
Параметры:

<Число> (обязательный)
Тип: Число.
Целое число, которое будет записано в целевой поток. Значение числа должно находиться в диапазоне от 0 до 2^64-1.

<ПорядокБайтов> (необязательный)
Тип: ПорядокБайтов.
Порядок байтов, который будет использован для кодировки числа при записи. Если не установлен, то будет использован порядок байтов, заданный для текущего экземпляра объекта ЗаписьДанных.
Значение по умолчанию: Неопределено.
Описание:

Записывает целое 16-битное число в целевой поток.

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

Тонкий клиент, сервер, толстый клиент, внешнее соединение.

См. также:
ЗаписьДанных, метод НачатьЗаписьЦелого64
ЗаписьДанных, метод ЗаписатьЦелое64Асинх

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

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

Описание изменено в версии 8.3.18.

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

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

Записать свой двоичный заголовок и прочитать поля 8/16/32/64 бит

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

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

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

Подготовка

  1. Используйте отдельную учебную базу. Фрагмент без директив вставьте в тело серверной процедуры ВыполнитьПример() Экспорт общего модуля УчебныеЗадачи.

  2. Все исходные байты создаются самим примером в памяти. Файлы, сеть, справочники и документы не нужны.

  3. Запускайте задачи отдельно. После закрытия ЧтениеДанных/ЗаписьДанных не используйте этот экземпляр повторно.

Поток = Новый ПотокВПамяти;
Запись = Новый ЗаписьДанных(Поток, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian);
Попытка
    Сообщить(Запись.ЦелевойПоток() = Поток);
    Сообщить(Запись.ПорядокБайтов = ПорядокБайтов.LittleEndian);
    Запись.ЗаписатьБайт(1);
    Запись.ЗаписатьЦелое16(4660);
    Запись.ЗаписатьЦелое32(16909060, ПорядокБайтов.BigEndian);
    Запись.ЗаписатьЦелое64(4294967296);
    Запись.СброситьБуферы();
Исключение
    Запись.Закрыть();
    Поток.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Запись.Закрыть();
Данные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Если Данные.Размер() <> 15 Тогда
    ВызватьИсключение "В заголовке должно быть 1 + 2 + 4 + 8 = 15 байтов";
КонецЕсли;
Буфер = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Данные);
Сообщить(Буфер.Получить(1) = 52 И Буфер.Получить(2) = 18);
Чтение = Новый ЧтениеДанных(Данные, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian);
Попытка
    Сообщить(Чтение.ПорядокБайтов = ПорядокБайтов.LittleEndian);
    Сообщить(Чтение.ПрочитатьБайт() = 1);
    Сообщить(Чтение.ПрочитатьЦелое16() = 4660);
    Сообщить(Чтение.ПрочитатьЦелое32(ПорядокБайтов.BigEndian) = 16909060);
    Сообщить(Чтение.ПрочитатьЦелое64() = 4294967296);
    Сообщить(Чтение.ПрочитатьБайт() = Неопределено);
    Сообщить(Чтение.ЧтениеЗавершено);
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();

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

  1. Версия занимает один байт, следующие поля 2, 4 и 8 байтов. Всего 15, независимо от десятичной длины чисел.

  2. LittleEndian задаётся конструктором. У ЗаписьДанных свойство ПорядокБайтов только для чтения; для одного поля порядок переопределяется аргументом метода.

  3. 4660 = 0x1234: при LittleEndian сначала идут 52 (0x34), затем 18 (0x12). Индексы буфера начинаются с нуля.

  4. Для 32-битного поля явно совпадают BigEndian при записи и чтении. Следующий 64-битный вызов снова использует значение по умолчанию LittleEndian.

  5. Сначала закрываем оболочку ЗаписьДанных, затем получаем двоичные данные из переданного нами потока. Оболочка не владеет этим отдельно созданным потоком.

  6. После последнего поля делаем попытку прочитать ещё байт: Неопределено означает конец, а не число 0.

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

  1. Размер пакета ровно 15 байтов; все выводимые сравнения Истина.

  2. 64-битное поле возвращает 4294967296, то есть число больше максимума 32-битного беззнакового поля.

  3. Никакой файл не появляется и данные учебной базы не меняются.

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

Собран и разобран конкретный 15-байтовый пакет с разным порядком байтов отдельных полей.

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

  1. Эти API кодируют БЕЗЗНАКОВЫЕ целые. Отрицательные и дробные значения нельзя передавать как обычные поля этого протокола.

  2. Числа не являются текстом UTF-8. Кодировка текста конструктора не меняет представление числовых полей.

  3. Не меняйте ширину поля наугад: чтение следующих полей сдвинется. Реальный протокол требует своей спецификации.

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

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

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

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

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