Что внутри любого QR-кода

Что внутри любого QR-кода

Внимательно смотрим на чёрно-белые квадраты

QR-код придумали намного раньше ковида — в 1994 году в Японии, в компании Denso. Им нужно было помечать на складе запчасти для машин, а обычных в то время штрихкодов уже не хватало — они могли хранить только 13 цифр, а этого не хватало для всего ассортимента на складе. С тех пор QR-код стал стандартом сначала для маркировки товаров, а потом — для хранения любой информации. В современных QR-кодах можно хранить картинки и даже звуки. 

Почему QR-код выглядит именно так

Главная задача, которую решали инженеры Denso, звучала так: «Как закодировать информацию таким образом, чтобы вместить туда гораздо больше данных, чем в простом штрихкоде?»

Обычный штрихкод — это последовательность узких и широких чёрных полос с белыми просветами между ними. Каждая комбинация полос и просветов кодирует какую-то цифру:

Что внутри любого QR-кода

Высота штрихкода не влияет на объём данных — даже если его растянуть в высоту в несколько раз, всё равно в нём будет закодировано столько же цифр. Можно было бы увеличить длину кода, но тогда рисунок стал бы слишком длинным и не помещался на всех поверхностях.

Чтобы решить эту проблему, QR-код сделали не одномерным, как штрихкод, а двумерным — когда информация закодирована и по горизонтали, и по вертикали. Такой приём увеличил плотность информации, и теперь код может хранить 7089 цифр или 4296 символов.

Что внутри любого QR-кода
Наведите камеру, чтобы узнать, что зашифровано в этом QR-коде

Зачем нужны три квадрата по углам

Три квадрата помогают считывающему датчику правильно развернуть код для дальнейшей обработки. Теперь подробнее. 

Обычный штрихкод считывается лазерным лучом, который пробегает по штрихам и составляет из них ноли и единицы. С QR-кодом так не сработает — лазеру нужно было бы пройти по каждому квадратику в коде, чтобы его считать. Поэтому QR-код сканируют более продвинутыми оптическими датчиками, похожими на сенсоры в цифровых камерах. Ну и цифровыми камерами тоже. 

Прежде чем алгоритм начнёт распознавать то, что там закодировано, ему нужно внутри себя правильно развернуть код, чтобы считать всё в определённой последовательности. Для этого в QR-код добавили три квадрата по углам — они говорят камере, как именно считан код, и помогают алгоритмам виртуально развернуть его нужной стороной. Система распознавания находит эти квадраты и поворачивает код так, чтобы правый нижний угол был без такого квадрата. После этого алгоритм приступает к расшифровке.

Для надёжности в QR-код добавляют четвёртый квадрат, поменьше — он помогает камере быстрее повернуть код нужной стороной:

Что внутри любого QR-кода

Как алгоритм понимает, какие данные там зашифрованы

В QR-коде могут храниться разные данные, которые закодированы тоже по-разному. Чтобы алгоритм понял, с чем именно ему предстоит работать, возле каждого большого квадрата есть область с информацией о том, что именно хранится в коде: текст, URL-адрес для браузера, картинка, звук или числа.

Алгоритм берёт данные из этой области, раскодирует их и понимает, какой метод нужно применить к остальным данным в коде.

Что внутри любого QR-кода
Эти области показывают алгоритму, как именно нужно расшифровывать этот код

Версии и работа с ошибками

Чтобы сделать код ещё более защищённым, разработчики предусмотрели в алгоритме автоматическое исправление ошибок — например, когда стёрлась часть квадратов или кто-то поверх него что-нибудь написал. В зависимости от версии алгоритма он способен восстановить данные, даже если повреждено 30% всех пикселей на картинке. 

Что внутри любого QR-кода
Этот код тоже считается, хотя мы стёрли много пикселей

Для этого используется специальный код Рида — Соломона. Он берёт исходные данные, добавляет к ним несколько проверочных символов (их должно быть в два раза больше, чем возможных ошибок) и составляет сложные математические уравнения. В коэффициентах этих уравнений и будут закодированы наши данные вместе с дополнительными. Если мы добавим 10 дополнительных символов, то сможем исправить 10 / 2 = 5 ошибок. 

Кстати, этот же код используется в компакт-дисках. Именно поэтому удаётся прочитать даже поцарапанный диск, когда часть фрагментов с данными физически испорчена.

Информация о том, какая версия алгоритма используется в QR-коде, находится тоже возле больших квадратов:

Что внутри любого QR-кода
Мы подсветили красными и жёлтыми пикселями служебную зону, где хранится информация о версии алгоритма для декодирования

Микроформат

Если данных немного, используют маленькие QR-коды с ёмкостью до 35 цифр или 21 буквы. В них для выравнивания применяется всего один квадрат в левом верхнем углу, а формат кодируется пикселями возле сторон квадрата:

Что внутри любого QR-кода

Как алгоритм дальше работает с данными

Сам алгоритм просто расшифровывает данные из QR-кода и возвращает их тому, кто их вызвал. Если это сканер в магазине, то вернётся название, цена и срок годности. Если это сертификат о прививках, то проверяющий получит ссылку на страницу Госуслуг, а если это служебный код на складе — номер стеллажа и яруса, на котором лежит нужная деталь.

Чаще всего QR-код используется для кодирования ссылок в обычном мире. Например, его используют в ресторанах, чтобы отправлять посетителей на страницу меню на сайте, или на чеке, чтобы можно было перейти на сайт налоговой и проверить его подлинность.

Что можно сделать с QR-кодом

Помимо веб-адресов в QR-коде можно зашифровать: 

  • настройку wi-fi для телефона — чтобы подключаться к домашнему интернету, не вводя пароль вручную;
  • данные о человеке в виде виртуальной визитки;
  • адрес электронной почты;
  • SMS на какой-то номер с предварительно записанным текстом; 
  • запрос на отправку криптовалюты на ваш кошелёк (или не ваш);
  • целый PDF-файл, MP3-файл или изображение;
  • ссылку на магазин приложений;
  • и с некоторыми техническими ухищрениями — даже несложную игру.

Как сделать QR-код

Для простых бытовых целей можно использовать любой генератор QR-кодов, который вы найдёте в поиске. Они работают плюс-минус одинаково, разница только в степени жадности создателей. 

Но если хотите, можно написать собственный скрипт-генератор, используя готовые библиотеки. Например: 

И ещё десятки других готовых библиотек. Все пригодные, вопрос лишь в возможностях. В одном из следующих выпусков попробуем это на практике.

Текст:

Михаил Полянин

Редактор:

Максим Ильяхов

Художник:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Алина Грызлова

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
Что такое непозиционная система счисления
Что такое непозиционная система счисления

Разбираем на примере римской системы

easy
Карьера аналитика данных в 26 лет: Касперский, X5 и «Много лосося»
Карьера аналитика данных в 26 лет: Касперский, X5 и «Много лосося»

Поговорили с Антоном Леоновым, выпускником ВШЭ и ментором «Практикума».

easy
Объясни мне: как устроен интернет
Объясни мне: как устроен интернет

Часть 1: Компьютеры и сеть.

easy
Разбор: непобедимый алгоритм для игры «4 в ряд»
Разбор: непобедимый алгоритм для игры «4 в ряд»

Разбор видео Code Bullet про трюки в оптимизации алгоритмов

medium
4 виртуальные машины на любой случай
4 виртуальные машины на любой случай

Машин нет, но они как бы есть

medium
Для чего нужен язык C#

Как в Микрософте сделали свой язык программирования. И зачем.

easy
Мобильная разработка для iOS и Android — что лучше и с чего начать?
Мобильная разработка для iOS и Android — что лучше и с чего начать?

Статья для тех, кто не знает, что выбрать

easy
Сжатие без потерь: как это работает
Сжатие без потерь: как это работает

Когда копия не отличается от оригинала.

easy
Пишем приложение на Vue.js
Пишем приложение на Vue.js

Простой проект с большими возможностями

hard
Как парень из Томска руководит бэкенд-разработкой в Практикуме
Как парень из Томска руководит бэкенд-разработкой в Практикуме

О CTF-турнирах и пути в Яндекс.

easy
medium