Читаємо qr код


Читаємо qr код

У статті розглянуті базові особливості QR кодів і методика дешифрування інформації без використання обчислювальних машин.

Рішення завдання безпосереднього читання інформації з QR-картинки розглянемо на прикладі двох кодів.

Читаємо qr код

Щоб зрозуміти, як витягти дані з коду, потрібно розібратися в алгоритмі. Існує кілька стандартів в сімействі QR кодів, з їх базовими принципами можна ознайомитися в специфікаціях. Коротко поясню: дані, які необхідно закодувати, розбиваються на блоки в залежності від режиму кодування. До розбитим по блокам даними додається заголовок, який вказує режим і кількість блоків. Існують і такі режими, в яких використовується більш складна структура розміщення інформації. Дані режими розглядати не будемо, з огляду на те, що витягати вручну з них інформацію недоцільно. Однак, грунтуючись на тих принципах, що описані нижче, можна адаптуватися і до цих режимів.

На випадок некоректного читання даних в QR застосовуються спеціальні коди, які здатні виправити недоліки при читанні. Це так звані коди Ріда-Соломона. Принцип обчислення кодів, а також виправлення помилок у блоках інформації розглядати не будемо, це тема окремої статті. Коригувальні помилки коди Ріда-Соломона (RS) записуються після всіх інформаційних даних. Це дуже спрощує завдання безпосереднього читання інформації: можна просто вважати дані, не чіпаючи коди. Як показує практика, зазвичай більшу частину QR -матриці займають коригувальні RS-коди.

За стандартом, дані з RS-кодами перед записом в картинку «перемішуються». Для цих цілей використовують спеціальні маски. Існує 8 алгоритмів, серед яких вибирається найкращий. Критерії вибору засновані на системі штрафів, про які можна також почитати в специфікації.

«Перемішані» дані записуються в особливій послідовності на шаблонну картинку, куди додається технічна інформація для декодер. Виходячи з описаного алгоритму, можна виділити схему вилучення даних з QR коду:

Читаємо qr код

Тут зеленим фломастером підкреслені пункти, які потрібно буде реалізувати при безпосередньому читанні коду. Інші пункти можна опустити на увазі того, що зчитування виробляє людина.


Читаємо qr код

Поглянувши на картинки, можна помітити кілька виразних областей. Ці області використовуються для детектування QR коду. Ці дані не представляють інтересу з точки зору записаної інформації, але їх потрібно викреслити або просто запам'ятати їх розташування, щоб вони не заважали. Все інше поле коду несе вже корисну інформацію. Її можна розбити на дві частини: системна інформація і дані. Також існує інформація про версії коду. Від версії коду залежить максимальний обсяг даних, які можуть бути записані в код. При підвищенні версії - додаються спеціальні блоки, наприклад як тут:

Читаємо qr код

За ним можна зорієнтуватися і зрозуміти яка версія QR перед вами. Коди високих версій зазвичай також недоцільно зчитувати вручну.

Розміщення системної інформації показано на малюнку:

Читаємо qr код

Системна інформація дублюється, що дозволяє значно знизити ймовірність виникнення помилок при детектуванні коду і зчитуванні. Системна інформація - це 15 біт даних, серед яких перші 5 - це корисна інформація, а решта 10 - це BCH (15,5) код, який дозволяє виправляти помилки в системних даних. До класу BCH кодів відносять і RS коди. Зверніть увагу, що на малюнку дві смужки по 15 біт не перетинаються.


Як вже говорилося, інтерес представляють тільки перші 5 біт. З яких 2 біта показують рівень корекції помилок, а решта 3 біта показують яка маска з доступних 8 застосовується до даних. У розглянутих QR коди системна інформація містить:

Читаємо qr код


Крім уже озвучених схем захисту системної інформації, в добавок, використовується статична маска, яка застосовується до будь-якої системної інформації. Вона має вигляд: 101010000010010. Так як має інтерес тільки перші 5 біт, то маску можна скоротити і легко запам'ятати: 10101 (десять-сто один). Після застосування операції «виключає або» (xor) отримуємо інформацію.

Можливі рівні корекції помилок:


Після вилучення 4-х біт, що описують режим, необхідно до них застосувати маску.
У нашому випадку для двох кодів використовуються різні маски. Маска визначається виразом, наведеними в таблиці вище. Якщо цей вислів зводиться до TRUE (правильне) для біта з координатами (i, j). то біт інвертується, інакше все залишається без змін. Початок координат в лівому верхньому кутку (0,0). Поглянувши на вираження, можна помітити в них закономірності. Для розглянутих QR кодів, маски будуть виглядати так:

Читаємо qr код

Читаємо qr код

Читаємо qr код


Після отримання даних про режим можна приступати до читання інформації. Треба домовитися про те, що найцікавіше зчитувати числові і комбіновані дані, так як вони легко інтерпретуються. Але також не варто боятися 8-бітних. Це може бути також легко інтерпретується інформація. Наприклад, багато онлайн генератори QR текст кодують в цьому режимі, використовуючи ASCII. Ще одна причина, чому слід спочатку прочитати режим це те, що від нього залежить кількість пакетів даних. Яка також залежить і від версії коду. Для версій з першої по дев'яту довжини блоків для більш Новомосковскбельних режимів:

Перший блок після покажчика режиму - це кількість символів. Для числового режиму кількість закодовано в 10 наступних бітах, а для 8-бітного режиму в 8 бітах (прошу вибачення за тавтологію).

Читаємо qr код

На малюнку видно, що в лівому QR коді, як і зазначалося, записана цифра 5. Це видно за вказівником кількості символів і подальшим після нього 4 бітам. У числовому режимі поряд з 10-бітними блоками використовуються 4-х бітні блоки для економії місця, якщо в 10-бітному обсязі немає необхідності. У правом коді, зашифровано 4 символу. На даний момент невідомо, що зашифровано в ньому. Тому необхідно перейти до читання у наступній колонці для вилучення всіх 4-х блок інформації.

Читаємо qr код

На малюнку видно, все 4 пакети представляють собою коди ASCII латинських букв, що утворюють слово «habr»

P.S. Дотримуйтесь правил ресурсу і умови Creative Commons Attribution 3.0 Unported (CC BY 3.0)

Схожі статті