Перейти к содержимому

Structured Append (составной QR-код)

Structured Append — режим ISO/IEC 18004, при котором одно сообщение разбивается на цепочку до 16 QR-кодов с индикатором позиции и контрольной суммой, а сканер собирает их обратно в единые данные.

Иногда данные не помещаются в один QR-код приемлемого размера, или на этикетке физически нет места под крупный символ. Тогда стандарт ISO/IEC 18004 разрешает разложить одно сообщение на цепочку из нескольких кодов, а совместимый сканер склеивает их обратно в исходные данные. Этот режим и называется Structured Append.

Как работает Structured Append

Сообщение делится на части, и каждая записывается в отдельный символ. В служебной области кода появляется заголовок Structured Append: индикатор режима (двоичное 0011), затем номер символа m и общее число символов n — по 4 бита на каждое поле, поэтому в наборе не больше 16 кодов. Следом идёт байт контрольной суммы (parity).

Parity одинаков во всех кодах набора. Его получают побитовым XOR всех байтов исходного сообщения — ещё до разбиения на части. Собрав коды, сканер пересчитывает это значение и сверяет: совпало — символы из одного набора, нет — среди них затесался чужой код. Пара m из n задаёт порядок, поэтому части можно подносить в любой последовательности — данные соберутся верно.

Когда применяют

Основной сценарий — данные не влезают в один код разумной версии. Ёмкость QR конечна: даже версия 40 держит ограниченный объём, а высокий уровень коррекции ошибок его ещё урезает. Второй случай — мало места: на мелкой детали или узкой упаковке крупный код не напечатать, зато несколько маленьких помещаются. В промышленной маркировке так дробят длинные строки с датой, партией и серийным номером.

Чем это отличается от набора отдельных кодов

Напечатать пять независимых QR-кодов — не то же самое. Независимые коды сканер читает как пять отдельных сообщений: он не знает ни их порядка, ни того, что они связаны, — склеивать приходится вручную на стороне приложения. Structured Append несёт метаданные о позиции и наборе, поэтому читатель сам восстанавливает единый поток, будто это был один большой символ.

Ограничение одно, зато весомое: режим должен поддерживать сканер. Многие камеры смартфонов и простые приложения игнорируют заголовок Structured Append и показывают каждый код по отдельности. Для массовой аудитории надёжнее уместить данные в один QR-код, а составной набор оставить для сценариев с контролируемым оборудованием.

Частые вопросы

Сколько кодов может быть в наборе Structured Append?

До шестнадцати. В заголовке под номер символа и под общее количество отведено по 4 бита, а это диапазон значений 0–15 — то есть максимум 16 кодов в одной цепочке. Если данных больше, чем вмещают 16 символов выбранной версии, придётся повышать версию QR или менять сам способ хранения данных.

Что такое parity в составном QR-коде?

Это байт контрольной суммы, одинаковый для всех кодов набора. Его вычисляют побитовым XOR всех байтов исходного сообщения — ещё до разбиения на части. Собрав коды, сканер пересчитывает значение и сверяет: так он убеждается, что все символы принадлежат одному сообщению, а не перемешаны с кодами из другого набора.

Чем составной QR отличается от нескольких обычных кодов?

Обычные коды независимы: сканер читает их как отдельные сообщения и не знает ни порядка, ни связи между ними. Structured Append добавляет в каждый код номер позиции m из n и общий parity, поэтому совместимый читатель автоматически собирает части в исходные данные в правильном порядке — как если бы это был один код.

Любой ли сканер прочитает Structured Append?

Нет. Режим описан в стандарте ISO/IEC 18004, но поддерживают его не все устройства. Промышленные сканеры и специализированные приложения обычно собирают набор автоматически, а штатные камеры смартфонов и простые читалки часто показывают каждый код отдельно, без склейки. Поэтому для широкой аудитории составной QR применяют осторожно.

Обязательно ли сканировать коды по порядку?

Нет. Каждый символ несёт свой номер позиции m из общего числа n, поэтому сканер восстанавливает правильную последовательность независимо от того, в каком порядке вы поднесли коды. Важно другое — считать все части набора: один пропущенный символ не даст собрать сообщение целиком.