Почему QR-код читается, даже если его порвать
Заклейте угол QR-кода, поставьте пятно, нарисуйте поверх логотип — а телефон всё равно его распознает. Это не везение, а встроенная защита: часть кода намеренно избыточна, чтобы пережить повреждение.
Грязный, мятый, с логотипом посередине — QR-код всё равно считывается, и за этой живучестью стоит та же идея, что спасает данные в космической связи.
QR-код хранит больше, чем нужно. Эта избыточность — не расточительство, а броня: она позволяет восстановить данные, даже когда часть кода уничтожена.
QR-код терпит издевательства, которые убили бы обычную ссылку. Поставьте кофейное пятно, оторвите уголок, налепите поверх центра фирменный логотип — телефон всё равно прочитает адрес. Секрет тот же, что у дисков RAID и сигналов из космоса: намеренная избыточность плюс умные коды коррекции ошибок.
Сначала — найти и выровнять
Прежде чем что-то читать, телефону надо сообразить, где код и как он повёрнут. Для этого служат три больших квадрата по углам — поисковые метки. Их характерный узор камера узнаёт под любым углом и с любого расстояния. По трём углам однозначно определяется четвёртый, ориентация и масштаб. Поэтому QR-код читается хоть вверх ногами, хоть под наклоном, хоть с кривой фотографии.
Дополнительные мелкие метки и сетка из чередующихся модулей помогают выровнять искажённую перспективу — например, когда код снят сбоку или наклеен на изгиб бутылки.
Главная защита: коды коррекции ошибок
Но живучесть к повреждениям даёт другое. В QR-код вшиты коды коррекции ошибок Рида-Соломона — та самая технология, что чинит данные на компакт-дисках и в дальней космической связи. Идея: к полезным данным добавляют избыточные «проверочные» модули, вычисленные из них. Если часть кода затёрта или прочитана неверно, по уцелевшим данным и проверочным символам исходное сообщение восстанавливается целиком.
Самое удобное — у QR-кода есть выбор уровня защиты. Их четыре, и они задают, какую долю кода можно потерять без вреда:
| Уровень | Можно повредить | Цена |
| L (низкий) | около 7% | больше данных влезает |
| M (средний) | около 15% | баланс |
| Q (высокий) | около 25% | меньше данных |
| H (максимальный) | около 30% | самый стойкий |
Вот почему дизайнеры спокойно лепят логотип в центр QR-кода: при уровне H можно «выбить» почти треть, и код всё равно соберётся. Логотип просто занимает часть той брони, что заложена с запасом.
А как же обычный штрихкод?
Полосатый штрихкод на упаковке устроен скромнее, но и в нём есть защита от ошибок. Последняя цифра — контрольная: она вычисляется из остальных по фиксированной формуле. Сканер пересчитывает её и сравнивает. Если из-за царапины или блика цифра прочиталась неверно, контрольная не сойдётся — и сканер просто промолчит вместо того, чтобы пробить не тот товар. Поэтому на кассе иногда приходится провести упаковкой дважды: первый раз код прочитался с ошибкой, проверка это поймала и отклонила.
Разница между двумя кодами показательна. Обычный штрихкод умеет лишь заметить, что прочитал неверно, и честно отказаться — исправить ошибку он не способен, поэтому код приходится сканировать заново. QR-код благодаря Риду-Соломону идёт дальше: он не только замечает повреждение, но и восстанавливает утраченное, не требуя повторного снимка. Это и есть скачок от простого обнаружения ошибок к их коррекции — та же ступенька, что отделяет бит чётности от настоящих самовосстанавливающихся кодов.
Одна идея на все случаи
QR-код, компакт-диск, ECC-память сервера, сигнал зонда у края Солнечной системы — все они держатся на общем принципе: добавь избыточность заранее, и переживёшь повреждение потом. Разница лишь в масштабе беды, к которой готовятся. Кофейное пятно на коде и космическая частица, перевернувшая бит за миллиарды километров от Земли, лечатся одной и той же математикой. В этом и красота кодов коррекции: немного лишних данных сегодня — спасённое сообщение, что бы с ним ни случилось по дороге.