Структурированное присоединение (Structured Append)
Структурированное присоединение — режим QR и Data Matrix, позволяющий разбить длинные данные на несколько символов (до 16) и автоматически «склеить» их при чтении.
Определение структурированного присоединения
Структурированное присоединение (Structured Append) — специальный режим двумерных штрих-кодов, при котором один логический массив данных разбивается на несколько физических символов, а сканер собирает их обратно в единое сообщение. Режим описан в стандарте ISO/IEC 18004 для QR-кода и в ISO/IEC 16022 для Data Matrix. В QR он появился ещё в оригинальной спецификации Denso Wave 1994 года.
Смысл прост: чем больше данных, тем крупнее и плотнее становится QR-код, и в какой-то момент напечатать его на маленьком носителе (наклейке, детали, бирке) уже невозможно. Structured Append разрешает поделить сообщение на от 2 до 16 символов, каждый из которых печатается отдельно и читается меньшей камерой. Результат идентичен одному большому коду, но физически удобнее.
Как работает Structured Append
Каждый символ в последовательности несёт служебный заголовок из трёх параметров. Во-первых, индекс — порядковый номер кода в цепочке (например, 3-й из 5). Во-вторых, итого — общее количество символов в последовательности. Сканер по этим двум числам понимает, сколько кодов нужно прочитать и в каком порядке их соединить, даже если пользователь считывает их вразнобой.
Третий параметр — parity-байт (контрольная сумма). Он вычисляется как XOR всех байтов исходного, ещё не разбитого сообщения и записывается одинаковым во все символы цепочки. Это защита от смешивания: если пользователь случайно отсканирует код из чужой последовательности, parity не совпадёт, и декодер отвергнет ошибочный символ. В QR под индекс и «итого» отводится по 4 бита (отсюда лимит 16), а под parity — 8 бит.
Связанные концепции
- Data Matrix — второй матричный формат с поддержкой Structured Append (до 16 символов).
- Reed-Solomon — коррекция ошибок внутри каждого отдельного символа цепочки.
- Aztec Code / PDF417 — родственные 2D-коды со своими механизмами склейки и большой ёмкостью.
На практике Structured Append нужен реже, чем кажется: обычно проще увеличить версию QR или снизить уровень коррекции. Но для маркировки миниатюрных деталей, гравировки на металле и промышленной трассировки режим незаменим. Сгенерировать одиночный код можно в конструкторе QR-кодов.
Частые вопросы
Сколько кодов можно объединить в одну последовательность?
Стандарт ISO/IEC 18004 разрешает Structured Append из 2–16 символов. Ограничение в 16 задано размером служебного поля: под индекс кода и общее количество отводится по 4 бита, а 4 бита кодируют значения от 0 до 15, то есть максимум 16 позиций. Тот же лимит действует и для Data Matrix по ISO/IEC 16022.
Зачем нужен parity-байт?
Parity-байт — это XOR всех байтов исходного сообщения до разбиения, записанный одинаковым во все символы цепочки. Он защищает от склейки чужих кодов: если отсканировать символ из другой последовательности, контрольная сумма не совпадёт, и декодер отвергнет ошибочный код. Так гарантируется, что собранное сообщение принадлежит одной цепочке.
Обязательно ли сканировать коды по порядку?
Нет. Каждый символ несёт свой индекс и общее количество, поэтому сканер сам расставляет фрагменты в правильном порядке независимо от того, в какой последовательности их считали. Однако декодер не выдаст итоговое сообщение, пока не соберёт все символы цепочки — пропущенный код заблокирует сборку.
Все ли сканеры поддерживают Structured Append?
Режим поддерживают промышленные считыватели и многие библиотеки декодирования (ZXing, libdmtx), но большинство встроенных камер смартфонов Structured Append не собирают — они читают каждый код как отдельный. Поэтому для потребительских сценариев (ссылка, визитка, Wi-Fi) режим не используют, оставляя его промышленной маркировке.
Чем Structured Append отличается от Reed-Solomon?
Это разные уровни. Reed-Solomon — коррекция ошибок внутри одного символа: восстанавливает повреждённые модули. Structured Append работает уровнем выше — делит логическое сообщение на несколько отдельных кодов и склеивает их. Оба механизма сочетаются: каждый символ цепочки внутри защищён своим блоком Reed-Solomon.