Список всех статей
QR коды, казалось бы, еще вчера были для нас диковинкой, а сегодня они уже буквально "на каждом углу", немудрено, что приложение для чтения подобного рода кодов можно установить практически на любой смартфон. Однако что делать, если специальной программы под рукой не имеется, а QR-код прочитать ну очень нужно. Думаете, все пропало? Нет, способ есть, хоть и сложен, и о нем – наша статья.
Разумеется, прежде чем понять, как извлечь код, необходимо разобраться с алгоритмом его генерации. Вообще сегодня имеется несколько стандартов QR-кодов, каждый из которых обладает своей тонкостью, однако общий принцип един – данные, которые требуется закодировать, предварительно бьются на блоки и кодируются определенным алгоритмом, затем, как правило, прибавляется заголовок для указания режима и числа блоков. Бывают и более сложные алгоритмы, однако о них мы говорить не будем, ибо пытаться извлечь информацию их них вручную - нецелесообразно.
В каждом QR-коде, на случай некорректного прочтения программой имеются специальные элементы – коды Рида-Соломона (RS), которые призваны исправить ошибки чтения. Алгоритм исправления ошибок мы описывать здесь не будем, потому как эта отдельная большая тема, однако укажем, что записываются корректирующие биты после информационных данных, что собственно значительно упрощают задачу декодирования QR-кода вручную. Причем, удивим вас, как правило, большую часть QR-матрицы занимают именно RS-коды, а не информационные.
Коды Рида-Соломона "примешиваются" в матрицу посредством специальных масок, и всего имеется 8 алгоритмов такой записи, из которых выбирается оптимальный. Критерии выбора этого оптимума отдельная тема, и к нашей задаче особого отношения не имеют, так что о них мы писать не будем.
"Примешанные" данные записываются в особенной последовательности на картинку-шаблон, куда затем добавляется техническая информация, необходимая для декодеров. Собственно, исходя из вышенаписанного, мы можем кратко изложить принцип программного извлечения информации QR-кода:
1. Распознавание черных и белых областей;
2. Декодирование формата данных;
3. Определение версии кода;
4. Использование маски;
5. Извлечение данных;
6. Извлечение корректирующих кодов;
7. Декодирование данных;
8. Корректировка;
9. Выход.
В том случае, когда извлечение производится человеком, пункты 1,3, 6, 8 и 9 можно опустить. Что ж, давайте приступим.
Обратите внимание на выделенные области, обратили? Теперь забудьте о них - данные этой области существуют для детектирования QR-кода, а потому для нас не несут полезной информации. Остальное же поле представляет для нас вполне определённый интерес, в нем хранятся системные информация и данные, а также прячется информация о версии кода, которая определяет максимальный объем данных.
Системная информация располагается следующим образом:
На самом деле, она дублируется, как вы понимаете, для того чтобы максимально снизить вероятность ошибок при чтении. Кроме того, только 5 из 15 системных бит – это полезная информация, остальные – корректирующий код. Как же ее прочесть?
Из 5 интересующих нас бит, 2 бита определяют уровень коррекции ошибок, остальные определяют один из восьми типов масок, которые могут применяться к данным.
Кроме того, имеется также статическая маска, имеющая вид 101010000010010, но поскольку интерес представляют опять же только первые пять бит, она сокращается до 10101, и после выполнения "исключающего или", мы получаем информацию, по которой можно оценить маску данных и уровень коррекции ошибок.
Существуют следующие уровни ошибок:
И следующие виды масок:
Теперь необходимо понять с какими данными нам придется иметь дело, для этого читаем 4-х битный заголовок, алгоритм чтения можно увидеть на картинке:
В нашем случае 4 бита на картинке слева равны - 0111, справа - 0100, смотрим в таблице режимов тип данных, с которыми предстоит иметь дело:
Теперь к битам, описывающим режим необходимо применить маску, которая определяется выражением, указанным в таблице масок, приведенной выше. Если наше выражение сведется к TRUE, что означает – верно, бит инвертируется, в противном случае все остается без изменений. Для наших примеров, маски будут выглядеть таким образом:
Затем получаем режимы:
И теперь можно приступать непосредственно к чтению информации. Конечно, наиболее интересно читать числовые или буквенно-числовые данные, поскольку их легко интерпретировать. Однако не стоит бояться и 8-битных кодов, в них тоже может скрываться просто интерпретируемая информация.
На рисунке, представленном выше, видно, что в левом QR коде зашифрована цифра пять, что видно по указателю числа символов, а также последующим после него четырем битам. Стоит отметить, что в числовом режиме применяются не только 10-битные блоки, но и 4-битные, когда есть задача сэкономить место, и при этом в 10-битном представлении особого смысла нет. В правом коде зашифровано четыре символа, и для того чтобы получить полную информацию, необходимо прочесть следующие столбцы.
Что ж, конечно, никто не спорит, что проще всего достать из кармана смартфон и в мгновенье ока считать QR-код, однако никто не знает, в какой ситуации какая информация нам может пригодиться.
Список всех статей