Код с подсказками: почему QR-код читается, даже если его залили чаем
Больше половины QR-кода — запас из проверочных чисел. Разбираем на условном примере, как телефон находит и пересчитывает испорченные клетки.
Эльдар сидит в чайхане. На столе — карточка с QR-кодом меню, и на неё только что опрокинули пиалу. Пятно задело заметную часть кода, но телефон всё равно открывает меню. Никто не протирал стол и не печатал код заново. Разберём, как это работает, на условном примере. Принцип описан в стандарте QR-кода и на сайте его разработчика; цифры ниже — пример кода версии 4 с самым сильным уровнем защиты.
Код — это поле клеток
QR-код — квадратное поле чёрных и белых клеток. Чёрная означает единицу, белая — ноль. Восемь клеток складываются в группу — один байт, в нём помещается один знак адреса. В нашем примере поле 33 на 33 клетки, а на адрес меню уходит 36 групп.
Больше половины кода — запас
Всего групп в нашем коде сто. Остальные 64 — запас. Они не повторяют адрес, а хранят проверочные числа, посчитанные из него по правилам кода Рида — Соломона. Выходит, больше половины кода нужно только на случай пятна, царапины или складки.
Почему запаса так много
Под пятном клетки читаются как попало, и телефон заранее не знает, какие группы испорчены. Каждую плохую группу сначала надо найти, а потом исправить, — на одну уходят две запасные. Поэтому 64 запасных спасают до 32 групп. Разработчик кода так и пишет: для исправления нужно вдвое больше проверочных слов, чем исправляемых.
Части кода перемешаны
Код разбит на четыре части, и их группы перемешаны по всему полю. Пятно в углу задевает понемногу каждую часть, а не съедает одну целиком: в нашем примере — по семь групп из восьми допустимых. Беречь надо три больших квадрата в углах: по ним телефон находит код и понимает, как он повёрнут. Если закрыть один из них, код может не прочитаться, даже когда остальное цело.
Сверка и пересчёт
Телефон считывает поле и сверяет проверочные числа. В нашем примере не сходятся 28 групп из ста — запаса хватает на 32. Телефон пересчитывает стёртые знаки, и адрес снова целый.
Что из этого следует
Код не угадывает и не дорисовывает. Адрес в нём с самого начала записан с подсказками — как в кроссворде, где пустую клетку восстанавливают по пересечениям. У запаса есть цена: чем сильнее защита, тем крупнее код. Чаще всего выбирают средний уровень защиты — около 15 %. Тот же приём — хранить данные с проверочными суммами — работает в бизнесе: в накладных, банковских реквизитах и резервных копиях.









Этот материал в соцсетяхTelegram