Код Хань Синя
Код Хань Синя (кит. 汉信码, англ. Han Xin code, букв. «код, чувствительный к китайскому») — двумерная (2D) матричная штрихкодовая символика, разработанная в 2007 году[1] китайской компанией Центр нумерации товаров Китая[2] (кит. 中国物品编码中心), с целью преодоления монополии QR-кода. Как и QR-код, код Хань Синя состоит из чёрных и белых квадратов, расположенных по квадратной сетке на белом фоне. Он имеет четыре поисковых шаблона и другие маркеры, обеспечивающие распознавание с помощью камерных сканеров. Код Хань Синя поддерживает коррекцию ошибок Рида-Соломона, что позволяет распознавать повреждённые изображения. В настоящее время стандартизован как ISO/IEC 20830:2021[3].
История и стандарты
Центр нумерации товаров Китая (кит. 中国物品编码中心) начал исследования[4] во время 10-й пятилетки Китая над собственным форматом 2D-штрихкодов, чтобы заменить QR-коды, считавшиеся японской монополией в области двумерных кодов. В 2007 году появился национальный стандарт GB/T 21049-2007[1], получивший название «чувствительный к китайскому» (Chinese-sensible code).
В 2011 году[5] американская организация AIM выпустила собственную спецификацию ISS Han Xin Code как официальный стандарт кодирования и разместила его в своём хранилище[6].
В 2015 году рабочая группа ISO/IEC JTC 1/SC 31 начала работу[7] по стандартизации кода Хань Синя на международном уровне, что вылилось в публикацию ISO/IEC 20830:2021[3] в 2021 году.
В 2022 году национальный стандарт был пересмотрен как GB/T 21049-2022[8] и получил название «Код Хань Синя» для согласования с международным стандартом ISO.
Ниже приведены патенты, связанные с кодированием и декодированием кода Хань Синя, зарегистрированные в Европе и США:
- Европейский патент EP3330887B1 (Fujian Landi Commercial Equipment Co Ltd), «Метод и система обнаружения шаблона признака китайскочувствительного кода»[9]
- Патент США US10095903B2 (Ingenico Fujian Technology Co Ltd), «Метод и система блочного декодирования двумерного кода»[10]
- Патент США US10528781B2 (Ingenico Fujian Technology Co Ltd), «Метод и система обнаружения характерных шаблонов для кода Хань Синя»[11]
Применение
Код Хань Синя применяется аналогично QR-коду. В настоящее время наибольшее распространение получил в Китае[12], поскольку поддерживает прямое кодирование китайских иероглифов. Однако его поддерживают большинство штрихкод-принтеров[13] и сканеров штрихкодов[14]. Считывание кода Хань Синя реализовано на устройствах с iOS[15] и Android[16], а также в ряде библиотек для работы со штрихкодами[17][18].
Основные достоинства кода Хань Синя:
- встроенное кодирование китайских иероглифов[19];
- поддержка ECI;
- встроенное компактное кодирование UTF-8 сжатие без потерь;
- отдельный компактный режим для кодирования URI;
- компактное кодирование данных с идентификаторами GS1 наряду с QR-кодом;
- полная поддержка ISO/IEC 646 для компактной цифровой и текстовой записи.
Конструкция штрихкода
Код Хань Синя представляет данные с помощью чёрных и белых квадратных модулей, где тёмный модуль соответствует единице, а светлый — нулю. Также существуют варианты кодировки в инвертированных цветах[3], но по умолчанию большинство сканеров поддерживают только стандартное отображение. Размер области — от 23 × 23 модулей (версия 1) до 189 × 189 (версия 84). В отличие от DataMatrix, код Хань Синя не имеет прямоугольных форматов, что ограничивает область его применения. Размер символа вычисляется по формуле:
Штрихкод состоит из следующих элементов:[3]
- Тихая зона — внешняя граница по периметру не менее 3X;
- Поисковый шаблон — четыре позиционных маркера по углам, определяют расположение кода;
- Выравнивающие шаблоны и вспомогательные выравнивающие шаблоны — с версии 4, улучшают декодирование искажённых кодов;
- Области структурной информации — вокруг поисковых шаблонов, кодируют параметры версии, маски и коррекции ошибок;
- Области данных — зашифрованные бинарные данные чёрно-белыми модулями.
Поисковый шаблон
Поисковый шаблон[3] — четыре позиционных маркера, размещённых по углам кода. Размер составляет 7×7 модулей, структура — 5 слоёв (тёмный 7×7, светлый 6×6, тёмный 5×5, светлый 4×4, тёмный 3×3).
Отношение размеров (сканируемых полос) — 1:1:1:1:3 или 3:1:1:1:1 (зависит от направления считывания), ориентация позволяет однозначно определить местоположение и поворот кода.
Каждый поисковый шаблон отделён сепаратором[3], примыкающим к области структурной информации.
Выравнивающий шаблон
Выравнивающие шаблоны[3] применяются с версии 4 (в версиях 1–3 их нет) и служат для точного определения ячеек в искажённых кодах. Типы:
- Выравнивающий шаблон — пошаговые выравнивающие линии;
- Вспомогательный выравнивающий шаблон — 6 модулей (5 светлых, 1 тёмный).
Выравнивающая линия — это тёмная линия и светлая полоска под ней по ширине одного модуля. Вспомогательный шаблон указывает границу области.
Примеры размещения выравнивающих шаблонов в разных версиях приведены ниже.
Область структурной информации
Область структурной информации[3] представляет собой однорядную полосу вокруг поисковых шаблонов. В коде Хань Синя две идентичные структуры, каждая из 34 модулей — по 17 вокруг каждого шаблона.
Записанная информация[3]:
- Версия + 20 (биты 0–7);
- Уровень коррекции ошибок (биты 8–9);
- Маска (биты 10–11);
- Данные коррекции Рида-Соломона (биты 12–27);
- Биты 28–33 игнорируются и могут быть любыми.
Метаинформация (биты 0–11) делится на тетрады (m2, m1, m0), добавляются 4 тетрады коррекции (r3…r0).
| Версия + 20 | Уровень коррекции ошибок | Индекс маски | Коды коррекции ошибок | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| m2 | m1 | m0 | r3 | r2 | r1 | r0 | |||||||||||||||||||||
| X0 | X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 | X10 | X11 | X12 | X13 | X14 | X15 | X16 | X17 | X18 | X19 | X20 | X21 | X22 | X23 | X24 | X25 | X26 | X27 |
Маскирование данных
Для приближения количества чёрных и белых модулей к отношению 1:1 применяется алгоритм маскирования[3] — последовательность маски применяется к области данных с помощью XOR. Области поисковых и выравнивающих шаблонов и структурной информации не маскируются. Алгоритмы маскировки приведены в таблице:
| Условие маскирования | Шаблон маски |
|---|---|
| Без маскирования | 00 |
| (i+j) mod 2=0 | 01 |
| ((i+j)mod 3+( j mod 3)) mod 2=0 | 10 |
| (i mod j + j mod i + i mod 3 + j mod 3) mod 2=0 | 11 |
i — индекс строки, j — индекс столбца, считаются с 1,1 (верхний левый модуль). Если условие истинно, бит маски равен 1.
Коррекция ошибок
Код Хань Синя использует коррекцию ошибок Рида — Соломона. Данные представлены в виде массива байтов, который разбивается на блоки[3], для каждого блока вычисляются байты коррекции ошибок (codewords), которые добавляются к данным, а затем все блоки объединяются в общий поток.
Арифметика строится на многочлене конечного поля x^8 + x^6 + x^5 + x (355 или 101100011b), начальный корень = 1[3].
Количество байтов коррекции зависит от версии и уровня коррекции — от 16 до 60 %, что позволяет исправлять до 30 % повреждённых модулей[3].
| Уровень коррекции | Доля восстановленных данных (%) | Кодировка уровня коррекции |
|---|---|---|
| L1 | 8 % | 00 |
| L2 | 15 % | 01 |
| L3 | 23 % | 10 |
| L4 | 30 % | 11 |
Область данных
Данные кодируются в массив байтов, который разбивается на блоки, для каждого блока рассчитываются байты коррекции. Затем блоки объединяются в массив[3].
(Данные) ⇒ (Блок коррекции 1) + ... + (Блок коррекции N) ⇒ (Массив codewords)
Пример: версия 5, уровень коррекции L4 — 27 codewords, 2 блока: (14, 20), (13, 22):
(D1...D14, D15...D27) ⇒ (D1...D14, E1.1...1.20) + (D15...D27, E2.1...2.22) ⇒ (D1...D14, E1.1...1.20, D15...D27, E2.1...2.22) ⇒ (C1...C69)
Далее массив делится по 13 байт, перемешивается по позиции…
В итоге codewords размещаются по строкам слева направо и сверху вниз: горизонтальный брак нарушает меньше байтов, вертикальный — больше.
Кодирование
В максимальной версии 84 код Хань Синя может закодировать 7827 цифр, 4350 латинских символов, 3261 байт или 1044–2174 китайских иероглифа[3]. Поддерживаются специальные режимы Unicode и промышленные режимы, которые могут смешиваться для лучшей компактности. Таблица ниже — ёмкость для различных версий и уровней коррекции:
| Версия | Размер | Уровень коррекции | Кодовые слова данных | Коды коррекции ошибок | Цифры | Текст | Байты | Китайские иероглифы |
|---|---|---|---|---|---|---|---|---|
| 1 | 23×23 | L1 | 21 | 4 | 45 | 26 | 18 | 6–12 |
| L4 | 9 | 16 | 15 | 10 | 6 | 2–4 | ||
| ... | ||||||||
| 22 | 65×65 | L1 | 354 | 68 | 843 | 470 | 351 | 113–234 |
| L4 | 168 | 254 | 399 | 222 | 165 | 53–110 | ||
| ... | ||||||||
| 84 | 189×189 | L1 | 3264 | 622 | 7827 | 4350 | 3261 | 1044–2174 |
| L4 | 1554 | 2332 | 3723 | 2070 | 1551 | 497–1034 | ||
Режимы кодирования
Все режимы кодирования делятся на группы[3]:
- Числовой (только цифры 0–9);
- Текстовый (весь набор символов ISO/IEC 646);
- Бинарный (байты 0–255);
- Режимы китайских иероглифов (1587600 символов из GB 18030 в 4 режимах);
- Режим Unicode с поддержкой ECI;
- Unicode-адаптивный режим с UTF-8 и встроенным сжатием без потерь;
- Режим GS1 (данные идентификаторов GS1);
- Режим URI (ссылки с компактированием).
| Режим | Индикатор режима | Бит на символ |
|---|---|---|
| Числовой | 0001b | 3,3 (10 бит на три цифры) |
| Текст | 0010b | 6 |
| Бинарный байтовый | 0011b | 8 |
| Стандартные иероглифы, область 1 | 0100b | 12 |
| Стандартные иероглифы, область 2 | 0101b | 12 |
| GB18030, 2-байтовая область | 0110b | 15 |
| GB18030, 4-байтовая область | 0111b | 21 |
| ECI | 1000b | переменно (мультибайт) |
| Unicode | 1001b | адаптивно (сжатие без потерь) |
| GS1 | 11100001b | переменно (цифровой+текстовый) |
| URI | 11100010b | переменно (2–7 бит на символ) |
Числовой режим
В числовом режиме[3] строка делится на блоки по три цифры (последний блок может быть короче) и кодируется по 10 бит (от 0 до 999). Префикс — 0001b, завершитель указывает количество цифр в конце.
| Цифр в последнем блоке | Завершитель |
|---|---|
| 1 | 1111111101b |
| 2 | 1111111110b |
| 3 | 1111111111b |
Пример: последовательность 12700402:
Префикс → 0001b
127 → 0001111111
004 → 0000000100
02 → 0000000010
Завершитель → 1111111110b
Текстовый режим
Текстовый режим кодирует символы ISO/IEC 646, каждый символ — 6 бит[3]. Есть два подрежима: Text1 (буквы и цифры), Text2 (знаки препинания, спецсимволы). Переключение — 11110b, завершитель — 111111b.
| Символ | ASCII | Значение | Символ | ASCII | Значение | Символ | ASCII | Значение |
|---|---|---|---|---|---|---|---|---|
| 0 | 48 | 000000b | L | 76 | 010101b | g | 103 | 101010b |
| 1 | 49 | 000001b | M | 77 | 010110b | h | 104 | 101011b |
| 2 | 50 | 000010b | N | 78 | 010111b | i | 105 | 101100b |
| 3 | 51 | 000011b | O | 79 | 011000b | j | 106 | 101101b |
| 4 | 52 | 000100b | P | 80 | 011001b | k | 107 | 101110b |
| 5 | 53 | 000101b | Q | 81 | 011010b | l | 108 | 101111b |
| 6 | 54 | 000110b | R | 82 | 011011b | m | 109 | 110000b |
| 7 | 55 | 000111b | S | 83 | 011100b | n | 110 | 110001b |
| 8 | 56 | 001000b | T | 84 | 011101b | o | 111 | 110010b |
| 9 | 57 | 001001b | U | 85 | 011110b | p | 112 | 110011b |
| A | 65 | 001010b | V | 86 | 011111b | q | 113 | 110100b |
| B | 66 | 001011b | W | 87 | 100000b | r | 114 | 110101b |
| C | 67 | 001100b | X | 88 | 100001b | s | 115 | 110110b |
| D | 68 | 001101b | Y | 89 | 100010b | t | 116 | 110111b |
| E | 69 | 001110b | Z | 90 | 100011b | u | 117 | 111000b |
| F | 70 | 001111b | a | 97 | 100100b | v | 118 | 111001b |
| G | 71 | 010000b | b | 98 | 100101b | w | 119 | 111010b |
| H | 72 | 010001b | c | 99 | 100110b | x | 120 | 111011b |
| I | 73 | 010010b | d | 100 | 100111b | y | 121 | 111100b |
| J | 74 | 010011b | e | 101 | 101000b | z | 122 | 111101b |
| K | 75 | 010100b | f | 102 | 101001b |
| Символ | ASCII | Значение | Символ | ASCII | Значение | Символ | ASCII | Значение |
|---|---|---|---|---|---|---|---|---|
| NUL | 0 | 000000b | NAK | 21 | 010101b | . | 46 | 101010b |
| SOH | 1 | 000001b | SYN | 22 | 010110b | / | 47 | 101011b |
| STX | 2 | 000010b | ETB | 23 | 010111b | : | 58 | 101100b |
| ETX | 3 | 000011b | CAN | 24 | 011000b | ; | 59 | 101101b |
| EOT | 4 | 000100b | EM | 25 | 011001b | < | 60 | 101110b |
| ENQ | 5 | 000101b | SUB | 26 | 011010b | = | 61 | 101111b |
| ACK | 6 | 000110b | ESC | 27 | 011011b | > | 62 | 110000b |
| BEL | 7 | 000111b | SP | 32 | 011100b | ? | 63 | 110001b |
| BS | 8 | 001000b | ! | 33 | 011101b | @ | 64 | 110010b |
| HT | 9 | 001001b | ” | 34 | 011110b | [ | 91 | 110011b |
| LF | 10 | 001010b | # | 35 | 011111b | \ | 92 | 110100b |
| VT | 11 | 001011b | $ | 36 | 100000b | ] | 93 | 110101b |
| FF | 12 | 001100b | % | 37 | 100001b | ^ | 94 | 110110b |
| CR | 13 | 001101b | & | 38 | 100010b | _ | 95 | 110111b |
| SO | 14 | 001110b | ‘ | 39 | 100011b | ` | 96 | 111000b |
| SI | 15 | 001111b | ( | 40 | 100100b | { | 123 | 111001b |
| DLE | 16 | 010000b | ) | 41 | 100101b | 124 | 111010b | |
| DC1 | 17 | 010001b | * | 42 | 100110b | } | 125 | 111011b |
| DC2 | 18 | 010010b | + | 43 | 100111b | ~ | 126 | 111100b |
| DC3 | 19 | 010011b | , | 44 | 101000b | DEL | 27 | 111101b |
| DC4 | 20 | 010100b | - | 45 | 101001b |
Бинарный режим
Бинарный режим кодирует произвольные байты 0–255. Формат: индикатор режима 0011b, 13-битный счетчик и последовательность 8-битных байт[3]. Завершителя не требуется.
Режимы китайских иероглифов
Это набор из 4 режимов для кодирования иероглифов GB 18030.
| Режим | Индикатор | Бит | Число символов | Описание |
|---|---|---|---|---|
| Область 1[3]:5.4.7 | 0100b | 12 | 4074 | Коды из GB 18030: байты B0–D7/A1–A3 и A1–FE для второго; A8A1–A8C0 (32 символа) |
| Область 2[3]:5.4.8 | 0101b | 12 | 3008 | Байты D8–F7 и A1–FE второго |
| GB18030, 2-байта[3]:5.4.9 | 0110b | 15 | 23940 | Байты 81–FE и 40–7E либо 80–FE |
| GB18030, 4-байта[3]:5.4.10 | 0111b | 21 | 1587600 | Байты: 81–FE; 30–39; 81–FE; 30–39 |
Unicode-режим
Unicode-режим[3] кодирует UTF-8 с встроенным сжатием без потерь. Алгоритм сам определяет структуру: последовательности по 1–4 байта анализируются и сжимаются по повторяющимся префиксам языковых блоков (кириллица, греческие и т. д.), чтобы кодировать только отличия.
GS1-режим
GS1-режим[3] начинается с флага 11100001b, завершитель — 11111111b. Данные делятся на идентификаторы GS1 и компактируются смешанными режимами. Пример: (10)123456ABC<FNC1>(240)DATA кодируется как:
⟨11100001b⟩ ⟨Числовой 10123456⟩ ⟨Текст ABC⟩ ⟨Числовой⟩ ⟨1111101000b (FNC1)⟩ ⟨Числовой 240⟩ ⟨Текст DATA⟩ ⟨11111111b⟩
URI-режим
URI-режим[3] предназначен для компактного кодирования ссылок. Использует собственные подрежимы URI-A, URI-B, URI-C[3], а также подрежим Percent-Encoding для %XX-последовательностей.
| Набор | Индикатор |
|---|---|
| URI-A | 001b |
| URI-B | 010b |
| URI-C | 011b |
| Percent-Encoding | 100b |
| Завершитель режима URI | 111b |
Percent-Encoding — для последовательностей %XX (8 бит). Начать с 100b, затем байты длины (длина %XX разделить на 3), после чего — байты значения (например, %FF → xFF).
| Набор URI-A | Набор URI-B | ||||
|---|---|---|---|---|---|
| Символ / фрагмент | Кодовое значение | Биты | Символ / фрагмент | Кодовое значение | Биты |
| a | 0 | 000000 | A | 0 | 000000 |
| b | 1 | 000001 | B | 1 | 000001 |
| Terminator A | 63 | 111111 | Terminator B | 63 | 111111 |
| Символ / фрагмент | Значение | Биты | Символ / фрагмент | Значение | Биты | Символ / фрагмент | Значение | Биты |
|---|---|---|---|---|---|---|---|---|
| A | 0 | 0000000 | R | 43 | 0101011 | ; | 86 | 1010110 |
| Terminator C | 127 | 1111111 |
Примечания
Литература
- Xiaolei Yu. Semi-physical Verification Technology for Dynamic Performance of Internet of Things System / Xiaolei Yu, Donghua Wang, Zhimin Zhao. — Springer, 2018. — P. 181. — ISBN 978-9811317590.
