QRkoder

Информация о формате QR-кода

Информация о формате — служебное поле QR-кода из 15 бит: два бита уровня коррекции, три бита номера маски и десять бит защиты BCH. Записывается в матрицу дважды рядом с поисковыми узорами.

Что такое информация о формате

Информация о формате (Format Information) — служебное поле QR-кода длиной 15 бит, которое сканер читает раньше всех остальных данных. В нём записано ровно две вещи: каким уровнем коррекции защищён код и какая из восьми масок наложена на область данных. Без этих двух чисел матрица бесполезна — декодер не знает, как снять маску и сколько байт отдано под коррекцию ошибок.

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

Что зашито в 15 битах

БитыЧто кодируютЗначения
1–2Уровень коррекцииM = 00, L = 01, H = 10, Q = 11
3–5Номер маски000–111 (маски 0–7)
6–15Код коррекции BCH(15,5)вычисляется из первых пяти бит

Обратите внимание на порядок уровней: он не совпадает с интуитивным L → M → Q → H. Индикаторы идут как M, L, H, Q — так задано в ISO/IEC 18004, и путаница на этом месте — классическая ошибка при написании своего декодера. Уровни L, M, Q и H отличаются долей кодовых слов, отданных под коррекцию: от примерно четверти символа при L до двух третей при H. Цифры 7, 15, 25 и 30 процентов, которые обычно приводят рядом с уровнями, означают не эту долю, а сколько повреждённых кодовых слов уровень позволяет восстановить.

Защита BCH и служебная XOR-маска

Пять значащих бит дополняются десятью проверочными по коду BCH(15, 5) с порождающим полиномом 10100110111. Связка исправляет до трёх ошибочных бит из пятнадцати: если поле формата не прочитается, дальше можно не пытаться, поэтому его защищают жёстче самих данных.

Дальше — трюк, который удивляет всех, кто впервые считает биты вручную. Готовое 15-битное слово ещё раз XOR-ится с постоянной маской 101010000010010. Причина в вырожденном случае: уровень M (00) с маской 0 (000) даёт нулевые данные и нулевой остаток BCH — пятнадцать нулей подряд, сплошное белое поле, которое декодеру трудно отличить от засветки. Постоянная XOR-маска гарантирует, что такого не будет.

Итог для пары «L + маска 0» выглядит так: 01000 → BCH даёт 010001111010110 → после XOR получается 111011111000100. Именно эта последовательность и ложится в матрицу.

Где в матрице лежат две копии

Пятнадцать бит записываются дважды, в разных углах — чтобы порванная этикетка или палец на объективе не убили код целиком.

  • Первая копия — буквой «Г» вокруг левого верхнего поискового узора: горизонталь по 8-й строке и вертикаль по 8-му столбцу (нумерация с нуля). Модуль на пересечении с временной дорожкой пропускается.
  • Вторая копия — разрезана надвое: восемь бит идут вдоль нижнего края правого верхнего поискового узора, семь оставшихся — вдоль правого края левого нижнего.

Рядом со второй копией всегда сидит тёмный модуль (dark module) в точке со столбцом 8 и строкой 4 × версия + 9. Он чёрный в любом QR-коде любой версии, данных не несёт и в 15 бит формата не входит — фиксированный ориентир, и только.

Ещё одна деталь: поле формата не маскируется маской данных — иначе снять маску было бы нечем.

Что будет, если поле формата повреждено

Три ошибочных бита BCH вытянет, четвёртый — уже лотерея. Если обе копии испорчены сверх этого предела, сканер видит матрицу, ловит поисковые узоры, но не понимает, чем её расшифровывать: код «виден», но не читается. Уровень коррекции H тут не спасает — коррекция данных начинается позже чтения формата. Отсюда правило для макета: рамки, подписи и логотипы держите подальше от полосы шириной в модуль, которая обводит поисковые узоры. Сравнить свой макет с эталоном можно, собрав такой же код в конструкторе QR-кодов.

Связанные концепции

  • Маска QR-кода — три бита формата хранят её номер.
  • Уровни коррекции L/M/Q/H — два бита формата хранят выбранный уровень.
  • Информация о версии — второе служебное поле, но только в версиях 7–40.

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

Сколько бит занимает информация о формате QR-кода?

Ровно 15 бит: 2 бита уровня коррекции, 3 бита номера маски и 10 бит проверочного кода BCH(15,5). Эти же 15 бит записываются в матрицу дважды, в разных углах символа, так что физически под поле формата уходит 30 модулей плюс один фиксированный тёмный модуль. Дублирование нужно, чтобы повреждение одного угла не сделало код нечитаемым.

Почему уровни коррекции кодируются как M=00, L=01, H=10, Q=11?

Так задано в ISO/IEC 18004: порядок индикаторов не совпадает с порядком уровней по силе защиты. Разработчики своих декодеров регулярно ошибаются именно здесь — принимают биты за прямую нумерацию L, M, Q, H и получают неверный уровень, а следом неверное деление на блоки данных и коррекции. Проверять стоит по таблице стандарта, а не по интуиции.

Зачем 15 бит формата ещё раз XOR-ятся с константой?

Чтобы исключить полностью нулевое поле. Комбинация «уровень M + маска 0» даёт нулевые данные и нулевой остаток BCH — пятнадцать белых модулей подряд, которые декодер плохо отличает от засветки или дефекта изображения. Постоянная маска 101010000010010 гарантирует, что в любом QR-коде поле формата содержит и чёрные, и белые модули.

Маскируется ли поле формата основной маской данных?

Нет. Восемь стандартных масок применяются только к области данных и кодовым словам коррекции. Служебные зоны — поисковые узоры, сепараторы, временные дорожки, узоры выравнивания, поле формата и поле версии — из маскирования исключены. Иначе получилась бы циклическая зависимость: чтобы снять маску, нужно прочитать её номер, а чтобы прочитать номер, нужно снять маску.

Можно ли восстановить код, если поле формата затёрто?

Частично. BCH(15,5) исправляет до трёх ошибочных бит в каждой копии, а копий две — поэтому мелкие царапины сканер переживает. Если испорчены обе копии сверх этого предела, остаётся только перебор: декодер может пробовать все 32 сочетания уровня и маски и смотреть, при каком варианте данные сходятся по Reed-Solomon. Некоторые библиотеки так и делают, но штатные сканеры смартфонов — нет.

Создавайте QR-коды бесплатно

Динамические QR-коды с аналитикой, дизайном и без ограничений по сканированиям.

Начать бесплатно