SDXF ( Structured Data eXchange Format ) — формат сериализации данных , определенный в RFC 3072. [1] Он позволяет собирать произвольно структурированные данные разных типов в один файл для обмена между произвольными компьютерами.
Возможность произвольной сериализации данных в самоописываемый формат напоминает XML , но SDXF не является текстовым форматом (как XML) — SDXF несовместим с текстовыми редакторами. Максимальная длина данных (как составных, так и элементарных), закодированных с помощью SDXF, составляет 16777215 байт (один меньше 16 МБ ).
Данные SDXF могут выражать произвольные уровни структурной глубины. Элементы данных являются самодокументирующими , что означает, что метаданные (числовые, символьные строки или структуры) кодируются в элементах данных. Конструкция этого формата проста и прозрачна: компьютерные программы получают доступ к данным SDXF с помощью четко определенных функций, освобождая программистов от изучения точной структуры данных.
Слово «обмен» в названии отражает другой вид прозрачности: функции SDXF обеспечивают независимое от архитектуры компьютера преобразование данных. Сериализации могут обмениваться между компьютерами (через прямую сеть, передачу файлов или CD) без дополнительных мер. Функции SDXF на принимающей стороне обрабатывают архитектурную адаптацию.
Структурированные данные — это данные с предсказуемыми шаблонами, более сложными, чем строки текста. [2]
Коммерческий пример: две компании хотят обмениваться цифровыми счетами-фактурами. Счета-фактуры имеют следующую иерархическую вложенную структуру:
СЧЕТ│├─ СЧЕТ_НОМЕР ├─ ДАТА├─ АДРЕС_ОТПРАВИТЕЛЯ│ ├─ ИМЯ│ ├─ ИМЯ│ ├─ УЛИЦА│ ├─ ИНДЕКС│ ├─ ГОРОД│ └─ СТРАНА├─ АДРЕС_ПОЛУЧАТЕЛЯ│ ├─ ИМЯ│ ├─ ИМЯ│ ├─ УЛИЦА│ ├─ ИНДЕКС│ ├─ ГОРОД│ └─ СТРАНА├─ СУММА_СЧЕТА├─ ОТДЕЛЬНЫЕ_ЭЛЕМЕНТЫ│ ├─ ОТДЕЛЬНЫЙ_ЭЛЕМЕНТ│ │ ├─ КОЛИЧЕСТВО│ │ ├─ НОМЕР_ЭЛЕМЕНТА│ │ ├─ ТЕКСТ_ПУНКТА│ │ ├─ ЗАРЯД│ │ └─ СУММА│ └─ ... ├─ УСЛОВИЯ...
Базовый элемент — это фрагмент. Сериализация SDXF сама по себе является фрагментом. Фрагмент может состоять из набора более мелких фрагментов. Фрагменты состоят из префикса заголовка из шести байтов, за которым следуют данные. Заголовок содержит идентификатор фрагмента в виде 2-байтового двоичного числа (Chunk_ID), длину и тип фрагмента. Он может содержать дополнительную информацию о сжатии, шифровании и многом другом.
Тип фрагмента указывает, состоят ли данные из текста (строки символов), двоичного числа (целого или с плавающей точкой) или фрагмент представляет собой композицию других фрагментов.
Структурированные фрагменты позволяют программисту упаковывать иерархические конструкции, такие как INVOICE выше, в структуру SDXF следующим образом: каждому именованному термину (INVOICE, INVOICE_NO, DATE, ADDRESS_SENDER и т. д.) присваивается уникальный номер в диапазоне от 1 до 65535 (2-байтовое беззнаковое двоичное целое число без знака). Верхний/самый внешний фрагмент создается с идентификатором INVOICE (то есть с соответствующим числовым chunk_ID) как структурированный фрагмент на уровне 1. Этот фрагмент INVOICE заполняется другими фрагментами на уровне 2 и выше: INVOICE_NO, DATE, ADDRESS_SENDER, ADDRESS_RECIPIENT, INVOICE_SUM, SINGLE_ITEMS, CONDITIONS. Некоторые фрагменты уровня 2 структурируются по очереди для двух адресов и SINGLE_ITEMS.
Точное описание см. на странице 2 RFC или здесь. [3]
SDXF позволяет программисту работать со структурами SDXF с компактным набором функций. Их всего несколько:
Для чтения фрагментов необходимо использовать следующие функции:
- инициализация
- Для инициализации структуры параметров и привязки к существующему фрагменту.
- входить
- Чтобы войти в структурированный Чанк, первый Чанк этой структуры готов к обработке.
- оставлять
- Оставить текущую структуру. Эта структура уже текущая.
- следующий
- Переход к следующему фрагменту, если он существует (в противном случае он покидает текущую структуру).
- извлекать
- Для переноса (и адаптации) данных из текущего фрагмента в программную переменную.
- выбирать
- Для поиска следующего фрагмента с заданным идентификатором фрагмента и сделать его текущим.
Для создания фрагментов необходимо использовать следующие функции:
- инициализация
- Инициализация структуры параметров и привязка к пустому выходному буферу для создания нового фрагмента.
- создавать
- Создайте новый фрагмент и добавьте его к текущей существующей структуре (если она существует).
- добавить
- Добавить полный фрагмент к SDXF-структуре.
- оставлять
- Оставить текущую структуру. Эта структура уже текущая.
Следующий псевдокод создает счета-фактуры:
init ( sdx , buffersize = 1000 ); // инициализируем структуру параметров SDXF sdx create ( sdx , ID = INVOICE , datatype = STRUCTURED ); // начало основной структуры create ( sdx , ID = INVOICE_NO , datatype = NUMERIC , value = 123456 ); // создаем элементарный Chunk create ( sdx , ID = DATE , datatype = CHAR , value = "2005-06-17" ); // еще раз create ( sdx , ID = ADDRESS_SENDER , datatype = STRUCTURED ); // Подструктура create ( sdx , ID = NAME , datatype = CHAR , value = "Peter Somebody" ); // element. Кусок внутри этой подструктуры ... create ( sdx , ID = COUNTRY , datatype = CHAR , value = "France" ); // последний внутри этой подструктуры leave ; // закрытие подструктуры ADDRESS_SENDER ... leave ; // закрытие подструктуры INVOICE
[4]
Псевдокод для извлечения структуры INVOICE может выглядеть следующим образом:
init ( sdx , container = pointer to an SDXF - structure ); // инициализируем структуру параметров SDXF sdx enter ( sdx ); // присоединяемся к структуре INVOICE. // while ( sdx.rc == SDX_RC_ok ) { switch ( sdx.Chunk_ID ) { case INVOICE_NO : extract ( sdx ); invno = sdx.value ; // функция extract помещает целочисленные значения в поле параметра 'value' break; // case DATE : extract ( sdx ) ; strcpy ( invdate , sdx.data ) ; // sdx.data — указатель на извлеченную строку символов break ; // case ADDRESS_SENDER : enter ( sdx ) ; // мы используем 'enter', потому что АДРЕС — это структурированный фрагмент do while ( sdx . rc == SDX_RC_ok ) // внутренний цикл ... break ; ... } }
SDXF не предназначен для чтения или изменения текстовыми редакторами. Связанная редактируемая структура — SDEF — Structured Data Editable Format. [5]