# Как работают QR-коды: почему порванный код всё равно сканируется

> QR-код хранит не только сообщение, но и запасные байты, вычисленные из него, поэтому сканер может восстановить байты, которые порваны, испачканы или закрыты логотипом. Четыре уровня, примерно от 7 до 30 % кодовых слов, и три квадрата в углах, которые лучше не закрывать. Объясняющее видео на 48 секунд, у каждой цифры есть источник.

- URL: https://oliverz.dev/ru/videos/qr-error-correction
- Author: Oliver Zhang (https://oliverz.dev)
- Language: ru
- Published: 2026-11-01
- Tags: qr-codes, how-it-works, explainer
- Video: https://www.youtube.com/shorts/pRCEMxXUiNc

> **Коротко:** QR-код хранит не только своё сообщение. Он добавляет к нему запасные байты, вычисленные из сообщения: коррекцию ошибок Рида — Соломона, ту же математику, что на музыкальных CD. Поэтому сканер может восстановить байты, которых не хватает или которые испорчены. Сколько запаса, выбираете вы: четыре уровня, L, M, Q и H, восстанавливают примерно 7, 15, 25 и 30 % кодовых слов, и чем больше запасных байтов, тем больше код. Вот почему логотип посередине может не помешать: для сканера это просто повреждение. Три квадрата в углах — другое дело: это не данные, они помогают сканеру найти код и выровнять его, и большинству сканеров они нужны.

## Порван, испачкан — и сканируется

DENSO WAVE, компания, разработавшая QR-код: "QR Code has error correction capability to restore data if the code is dirty or damaged." («QR-код умеет исправлять ошибки и восстанавливать данные, если код испачкан или повреждён».) И в списке его особенностей: "Data can be restored even if the symbol is partially dirty or damaged." («Данные можно восстановить, даже если символ частично испачкан или повреждён».)

Код в видео настоящий: в нём записано oliverz.dev. Он порван в углу, испачкан у края и закрыт логотипом посередине, 13 из его 44 кодовых слов неверны, и всё же он декодируется (мы проверили двумя декодерами, jsQR и ZXing).

## Запасные байты, вычисленные из сообщения

DENSO WAVE: "The QR Code error correction feature is implemented by adding a Reed-Solomon Code… to the original data." («Коррекция ошибок в QR-коде реализована добавлением кода Рида — Соломона к исходным данным».) Computer Science Field Guide Кентерберийского университета говорит проще: "it adds extra bits to the data so that errors can be corrected." («к данным добавляются лишние биты, чтобы ошибки можно было исправить».)

Единица здесь — кодовое слово. DENSO WAVE: "codeword is a unit that constructs the data area. One codeword of QR Code is equal to 8 bits." («Кодовое слово — единица, из которой состоит область данных. Одно кодовое слово QR-кода равно 8 битам».) И CS Field Guide: "Each black or white square (“dot” or “module”) corresponds to one bit of data." («Каждый чёрный или белый квадратик („точка“ или „модуль“) соответствует одному биту данных».) Значит, восемь модулей — это один байт.

Математика не новая. DENSO WAVE: "Reed-Solomon Code is a mathematical error correction method used for music CDs etc. The technology was originally developed as a measure against communication noise for artificial satellites and planetary probes." («Код Рида — Соломона — математический метод исправления ошибок, который используется, например, в музыкальных CD. Изначально эту технологию разработали для борьбы с помехами связи у искусственных спутников и планетных зондов».)

## Два запасных байта на каждый исправленный

DENSO WAVE: "Reed-Solomon Code requires twice the amount of codewords to be corrected." («Коду Рида — Соломона нужно вдвое больше кодовых слов, чем требуется исправить».) CS Field Guide: "The maximum number of errors that a Reed-Solomon code can correct is one half of the amount of extra error correcting data added to it." («Наибольшее число ошибок, которое может исправить код Рида — Соломона, — половина объёма добавленных к нему корректирующих данных».)

Наш код на самом высоком уровне содержит 16 кодовых слов сообщения и 28 запасных, всего 44. Половина от 28 — это 14, так что он может исправить до 14 неверных кодовых слов: 14 из 44 — около 32 % (наш расчёт), то самое "Approx. 30%" («примерно 30 %») у DENSO. В нашей проверке предел оказался ровно там: с 14 неверными кодовыми словами код читался, с 15 результата не было.

Нет результата — а не неверный результат. CS Field Guide: "they won’t read the data incorrectly, instead they just refuse to give any data at all, rather than giving you incorrect data." («они не прочтут данные неправильно, а просто откажутся выдавать что-либо, вместо того чтобы дать вам неверные данные».)

## Четыре уровня: от 7 до 30 %

Из обзора стандарта (ISO/IEC 18004) на сайте DENSO WAVE: "Level L Level M Level Q Level H Approx. 7% of codewords can be restored. Approx. 15% of codewords can be restored. Approx. 25% of codewords can be restored. Approx. 30% of codewords can be restored." («Уровни L, M, Q, H: можно восстановить примерно 7 % кодовых слов; примерно 15 %; примерно 25 %; примерно 30 %».)

Процент считается от кодовых слов, а не от видимой площади: "*Data restoration rate for total codewords" … "QR Code therefore represents its error correction rate as a ratio of the total codewords." («*Доля восстанавливаемых данных от всех кодовых слов… Поэтому QR-код выражает свой уровень коррекции ошибок как долю от общего числа кодовых слов».)

Запасные байты занимают место. DENSO WAVE: "Raising this level improves error correction capability but also increases the amount of data QR Code size." («Повышение уровня улучшает исправление ошибок, но увеличивает и объём данных, и размер QR-кода».) И: "as the amount of data increases, more modules are required to comprise QR Code, resulting in larger QR Code symbols." («С ростом объёма данных QR-коду нужно больше модулей, и символы становятся крупнее».) Наши четыре кода oliverz.dev, кодовые слова сообщения + запасные:

- L: 19 + 7, 21 × 21 модуль
- M: 16 + 10, 21 × 21 модуль
- Q: 13 + 13, 21 × 21 модуль
- H: 16 + 28, 25 × 25 модулей (на уровне H 11 байт "oliverz.dev" уже не помещаются в 21 × 21)

## Логотип — это повреждение, которое он чинит

Поэтому логотип посередине может работать: сканер считает его повреждением и восстанавливает то, что он закрывает. На нашем коде уровня H логотип размером 7 × 7 модулей портит 9 из 44 кодовых слов — в пределах лимита в 14.

Но даром это не проходит: логотип тратит запасные байты. FAQ DENSO WAVE о кодах с цветами или вставленной картинкой: "If it is deformed, the QR Code's error correction function is invoked where even a tiny missing or smeared part renders the reading operation impossible, or the response of the operation may become slow." («Если код деформирован, включается коррекция ошибок QR-кода, и тогда даже крошечный недостающий или смазанный фрагмент может сделать чтение невозможным или замедлить его».)

## Не закрывайте углы

Три больших квадрата — это не данные. DENSO WAVE: "QR Code accomplishes this task through position detection patterns located at the three corners of the symbol." («QR-код решает эту задачу с помощью шаблонов определения положения в трёх углах символа».) В истории кода на сайте DENSO WAVE сказано, что благодаря им "the orientation of their code could be determined regardless of the angle of scanning, which could be any angle out of 360°" («ориентацию кода можно было определить при любом угле сканирования, каким угодно из 360°»).

CS Field Guide: "Don’t colour in near the three large squares in the corners, as most QR scanners need these to align the image." («Не закрашивайте ничего рядом с тремя большими квадратами в углах: большинству QR-сканеров они нужны, чтобы выровнять изображение».)

В нашей проверке маленькой наклейки размером 3 × 3 модуля в центре одного углового квадрата хватило, чтобы оба декодера сдались, хотя ни один байт данных не был затронут. Логотип закрывает 49 модулей, и код сканируется; наклейка закрывает 9 — и нет.

## Вывод

1. QR-код хранит сообщение и запасные байты, вычисленные из него (Рид — Соломон), поэтому сканер восстанавливает байты, которые порваны, испачканы или закрыты.
2. Сколько запаса — выбираете вы: L, M, Q, H, примерно от 7 до 30 % кодовых слов; больше запасных байтов — больше код. Логотип посередине — это повреждение, которое покрывают запасные байты.
3. Три квадрата в углах — не данные: они помогают сканеру найти код и выровнять его, и большинству сканеров они нужны.

## Источники

- DENSO WAVE: [Error Correction Feature](https://www.qrcode.com/en/about/error_correction.html), [QR Code Standardization](https://www.qrcode.com/en/about/standards.html), [What is a QR Code?](https://www.qrcode.com/en/about/), [Information capacity and versions of the QR Code](https://www.qrcode.com/en/about/version.html), [History of QR Code](https://www.qrcode.com/en/history/), [FAQ](https://www.qrcode.com/en/faq.html)
- Кентерберийский университет (University of Canterbury), Computer Science Field Guide, [QR codes](https://www.csfieldguide.org.nz/en/chapters/coding-error-control/qr-codes/)

Видео анимировано кодом, а сценарий написан с помощью ИИ; каждая цитата выше сверена с источником, а цифра с пометкой «наш расчёт» посчитана нами. Коды настоящие (сгенерированы, затем декодированы jsQR и ZXing), как и их байты и число кодовых слов. Условно показано: разрыв, пятно и логотип (условный знак без бренда, нарисованный ровно на тех модулях, которые мы проверяли), видоискатель камеры и наклонённый код — тот же код, нарисованный в перспективе. Настоящий износ менее аккуратен, чем повреждения, нарисованные по модулям. «QR Code» — зарегистрированный товарный знак DENSO WAVE INCORPORATED. Видео озвучено на английском. Сделано в [Shotloop](https://oliverz.dev/ru/products/shotloop) — моём бесплатном Mac-приложении для объясняющих видео из кода, которые правятся по одной сцене за раз.
