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

Кодовое слово

Кодовое слово (codeword) — атомарный блок данных в QR-коде размером 8 бит (1 байт). Весь поток информации матрицы делится на слова данных и слова коррекции ошибок; именно от их соотношения зависит, насколько повреждённый QR ещё можно прочитать.

Кодовое слово — минимальная единица хранения информации в QR-коде: ровно 8 бит, один байт. Стандарт ISO/IEC 18004 оперирует ими повсюду: ёмкость версии выражается в кодовых словах, уровень коррекции задаётся их числом, а алгоритм Рида-Соломона и вовсе работает исключительно на уровне слов, не битов.

Слова данных и слова коррекции

Общее число кодовых слов в матрице фиксировано для каждой версии. QR версии 1 вмещает 26 слов, версии 40 — 3706. Они делятся на два типа.

Слова данных несут полезную нагрузку: символы URL, текст, номер телефона — всё, что пользователь закодировал. Слова коррекции ошибок (error correction codewords) — избыточные, вычисляются алгоритмом из слов данных и кодируются в отдельный блок матрицы. Сканер использует их, чтобы восстановить испорченные слова данных без каких-либо сведений о том, что именно было повреждено.

При версии 1-M (версия 1, уровень M) из 26 слов 10 отведено под коррекцию, 16 — под данные. Именно поэтому в слова данных войдёт не более 14 символов ASCII, хотя матрица содержит 26 × 8 = 208 модулей полезной площади.

Связь с Рида-Соломона

Слова коррекции вычисляются по коду Рида-Соломона над полем GF(256) — тем же, что используется в CD, DVD и дисках RAID-6. Каждое слово коррекции — это остаток от деления полинома данных на порождающий полином степени t, где t = число слов коррекции. Сканер выполняет обратную операцию: находит синдромы ошибок, определяет позиции и значения испорченных слов, восстанавливает их.

Принципиально важно, что Рид-Соломон исправляет ошибки в целых словах, а не в отдельных битах. Поэтому два повреждённых бита в одном слове «стоят» столько же, сколько восемь — исправляется одно слово целиком. Отсюда совет: при повреждении ставить логотип компактным квадратом, а не полосой — полоса цепляет больше слов.

Уровни коррекции: сколько слов тратится

QR-стандарт определяет четыре уровня — L, M, Q, H. Каждый задаёт долю слов коррекции от общего числа и максимальный процент восстанавливаемых слов данных:

  • L — ~7% слов коррекции, восстанавливает до 7% слов данных. Минимальная плотность матрицы.
  • M — ~15%, восстанавливает до 15%. Баланс размера и надёжности, дефолт большинства генераторов.
  • Q — ~25%, восстанавливает до 25%. Подходит для промышленной маркировки.
  • H — ~30%, восстанавливает до 30%. Используется при наложении логотипов и в агрессивных средах.

Чем выше уровень, тем меньше слов данных помещается в матрицу той же версии — и тем крупнее матрица нужна для той же полезной нагрузки. Генератор QRcode.website автоматически подбирает версию под выбранный уровень коррекции и длину данных.

Пример: QR версии 5-H

Версия 5, уровень H содержит 134 кодовых слова суммарно. Из них 86 — слова коррекции, только 48 — слова данных (2 блока по 11 слов + 2 блока по 13). Это значит, что 64% объёма матрицы отдано под избыточность. Именно такой QR выживает после наклейки корпоративного логотипа поверх центра — повреждается до трети слов, но сканер восстанавливает все 48 слов данных по оставшимся 86 словам коррекции.

Чем кодовое слово отличается от модуля QR-кода?

Модуль — физический квадрат (пиксель) на матрице, чёрный или белый. Кодовое слово — логическая единица: 8 модулей, собранных по правилам разметки зон данных стандарта ISO 18004. Один модуль не несёт смысла сам по себе; смысл появляется только при чтении группы из восьми.

Почему именно 8 бит, а не 16 или 4?

QR работает над полем Галуа GF(256) = GF(2^8). Восемь бит — натуральный размер элемента этого поля, что делает арифметику Рида-Соломона простой и аппаратно дешёвой. Именно поэтому 256-элементное поле используется в CD, QR и RAID-6: один байт = один элемент поля = одно кодовое слово.

Если я ставлю логотип в центр, сколько слов это «съедает»?

Квадратный логотип, перекрывающий 30% площади матрицы, повреждает примерно 30% кодовых слов. Уровень H выдерживает это. Но логотип лучше ограничивать 20–25% площади — остаётся запас на грязь, царапины и плохое освещение при сканировании.

Что происходит, если повреждено больше слов, чем может исправить уровень коррекции?

Декодирование завершается ошибкой: сканер не выдаёт результат вообще. Это «честное» поведение — никаких частичных или искажённых данных. Именно поэтому при критически важных применениях (промышленная маркировка, авиабилеты) выбирают уровень Q или H с большим запасом по числу слов коррекции.

Влияет ли тип данных (URL, текст, числа) на число кодовых слов?

Да. QR использует разные режимы кодирования: числовой (до 3,3 бита на символ), буквенно-цифровой (5,5 бит) и байтовый (8 бит, один символ = одно кодовое слово). URL с кириллицей в UTF-8 занимает больше слов данных, чем тот же URL в ASCII — потому что кириллический символ кодируется двумя байтами.