Байты-заполнители QR-кода (Padding Bytes)
Байты-заполнители — значения 11101100 и 00010001, которыми QR-код по очереди добивает область данных до полной ёмкости версии. Участвуют в расчёте коррекции, но декодером игнорируются.
Что такое байты-заполнители
Байты-заполнители (padding bytes) — служебные кодовые слова, которыми QR-код добивает область данных до конца, когда полезная нагрузка её не заполнила. Стандарт ISO/IEC 18004 задаёт для них два конкретных значения: 11101100 и 00010001 — в шестнадцатеричном виде EC и 11. Они идут строго по очереди, начиная с первого, и повторяются, пока свободные кодовые слова не кончатся.
Причина существования добивки простая: ёмкость области данных фиксирована. Пара «версия плюс уровень коррекции» жёстко определяет, сколько кодовых слов данных должно быть в коде. Не 19 или сколько получится, а ровно 19. Пустых мест в матрице не бывает — каждый модуль должен быть чем-то занят, иначе декодер не поймёт, где кончилась информация и начался мусор.
Как собирается добивка
После того как полезная нагрузка закодирована, генератор проходит три шага в фиксированном порядке:
- Терминатор. К битовому потоку дописываются четыре нуля — признак конца данных. Если до края ёмкости осталось меньше четырёх бит, терминатор укорачивают до того, что помещается.
- Выравнивание по байту. Добавляются нулевые биты, пока длина потока не станет кратной восьми. Это не заполнители, а именно доборка последнего кодового слова: от нуля до семи бит.
- Заполнители. Все оставшиеся кодовые слова заполняются чередованием EC, 11, EC, 11 и так далее до конца области данных.
Дальше заполненный блок данных идёт в расчёт коррекции по алгоритму Рида — Соломона наравне с реальным содержимым, потом на чередование блоков и в матрицу.
Пример: один символ в версии 1
Версия 1 с уровнем коррекции L несёт 19 кодовых слов данных и 7 кодовых слов коррекции — всего 26. Закодируем в байтовом режиме одну латинскую букву:
- индикатор режима — 4 бита;
- счётчик символов — 8 бит, значение 1;
- сам символ — 8 бит;
- терминатор — 4 бита.
Итого 24 бита, ровно три кодовых слова. Остальные шестнадцать из девятнадцати — заполнители: восемь пар EC и 11. То есть больше 80% области данных занято байтами, которые не несут ни одного бита смысла. И это абсолютно штатная ситуация.
Почему код с двумя символами такой же плотный
Вопрос звучит постоянно: почему QR с коротким текстом выглядит таким же густым, как с длинным. Ответ в двух фактах. Первый — версий всего сорок, и они дискретны: минимальная матрица 21×21 модуль, промежуточных размеров не существует. Второй — внутри выбранной версии область данных заполняется целиком, чем бы то ни было.
Поэтому буква и семнадцатибайтовая строка дают одинаковую по размеру матрицу 21×21, а рисунок отличается только расположением тёмных модулей. Разницу вы увидите лишь тогда, когда данные перевалят через границу ёмкости версии — тогда генератор возьмёт следующую, и код подрастёт скачком.
Отсюда практический вывод для тех, кто сокращает ссылки: срезать адрес с 30 символов до 25 часто бессмысленно, если обе длины помещаются в одну версию. Смысл появляется, когда сокращение переводит код на версию ниже. Границы ёмкости разобраны в термине ёмкость данных QR-кода, а прикинуть результат проще всего экспериментом в генераторе QR-кодов.
Нюансы, о которых редко пишут
Заполнители защищены коррекцией наравне с данными. Рид — Соломон считает байты коррекции по всему блоку, не разделяя смысл и добивку. Обратная сторона: повреждение, попавшее в область заполнителей, всё равно расходует ресурс исправления, хотя восстанавливать там нечего.
Декодер их никогда не интерпретирует. Он читает индикатор режима, затем счётчик символов, берёт ровно столько символов, сколько заявлено, встречает терминатор и останавливается. Всё, что дальше, не разбирается вовсе — поэтому увидеть EC и 11 в результате сканирования невозможно.
Значения выбраны не случайно. Два байта с разными битовыми рисунками, идущие вперемешку, не дают области заполнителей превратиться в монотонное поле из одинаковых модулей. Ровные однотонные участки сканеру неудобны: их сложнее разграничить, и они хуже переносят неточности печати.
Частые вопросы
Можно ли убрать байты-заполнители, чтобы код стал меньше?
Нет. Количество кодовых слов данных задано таблицами ISO/IEC 18004 для каждой пары «версия плюс уровень коррекции», и недобитый блок просто не является корректным QR-кодом. Уменьшить код можно только двумя способами: сократить данные настолько, чтобы они уместились в версию ниже, или снизить уровень коррекции — тогда под данные освободятся кодовые слова, ранее занятые коррекцией. Заполнители при этом никуда не денутся, их станет больше или меньше.
Почему именно 11101100 и 00010001?
Эти значения прямо прописаны в стандарте ISO/IEC 18004 как единственно допустимые для добивки. В шестнадцатеричном виде они записываются как EC и 11. Порядок тоже фиксирован: первым идёт 11101100, вторым 00010001, дальше по кругу. Смысл в чередовании двух разных битовых рисунков: сплошная лента из одинаковых байтов дала бы в матрице крупные однородные пятна, а пёстрая — нет. Отступать от этих значений нельзя, иначе код перестаёт соответствовать стандарту.
Влияют ли заполнители на надёжность кода?
Косвенно — да, и не в лучшую сторону. Байты коррекции считаются по всему блоку данных, включая добивку, поэтому царапина, попавшая в зону заполнителей, тратит тот же ресурс восстановления, что и повреждение реальных данных. Полезной информации там нет, но декодер об этом не знает и честно чинит. С другой стороны, ресурс коррекции зависит только от уровня L, M, Q или H, и при разумном выборе уровня его хватает с запасом.
Почему QR полностью меняет рисунок, если поменять один символ?
Потому что меняется не один байт, а почти всё. Новый символ сдвигает битовый поток, из-за чего смещаются терминатор и граница выравнивания, а затем пересчитываются все байты коррекции — Рид — Соломон устроен так, что изменение одного входного байта меняет весь остаток от деления. Дальше поток проходит чередование блоков и наложение маски. В итоге две версии кода с почти одинаковым содержимым выглядят как совершенно разные картинки.
Сколько заполнителей в типичном QR со ссылкой?
Обычно немного, и это хороший признак. Генератор подбирает минимальную версию, в которую данные помещаются, поэтому свободного места остаётся мало — часто единицы кодовых слов. Много заполнителей появляется в двух случаях: когда содержимое совсем короткое и упирается в минимум версии 1, и когда версия задана вручную с запасом. В первом случае это неизбежно, во втором — повод не фиксировать версию и позволить генератору выбрать её самому.
Автор материала
Андрей СамойловЭксперт по QR-кодам и SaaS-маркетингу. 10 лет в SaaS, маркетинге и ИТ.
Об авторе и все материалы