Задание: необходимо создать кодовое слово, состоящее из 8 цифр (на примере – 01234567) на основе алгоритма, приведенного в ГОСТ Р ИСО/МЭК 18004-2015 (п. 7.4.3, пример 2). Затем создать для полученного кода Micro QR Code вер. М2. Данный режим невозможно прочитать стандартными ресурсами мобильных устройств, производимых GAFAM (как оказалось, свободно распространяемые библиотеки просто страшно глючат, поэтому Ассоциация отказалась от этого режима).

Этап 1. Кодирование исходных данных

Рассмотрим М2 поближе. Имеем матрицу размерностью 13x13 бинарных символов, один индикатор и два определителя (горизонтальный и вертикальный) (рис. 1).

Рисунок 1 – Исходная матрица для М2
Рисунок 1 – Исходная матрица для М2

Примечание: здесь и далее будем использовать один из доступных программных инструментов практически на любом ПК – MS Excel (русскоязычная версия). Как следствие, все команды автоматизации процессов будут на кириллице.

Примечание: здесь и далее будет использоваться информация ГОСТ Р ИСО/МЭК 18004-2015 или в оригинале ISO/IEC 18004:2015 (далее – ГОСТ).

Первый наносимый ограничитель символ на матрицу М2 – битовая последовательность информации о формате (рис. 2). Чтение битовой последовательности начинается с 14 бита, т.е. последовательность чтения/записи будет 14, 13, 12, 11, 10 и т.д.

Рисунок 2 – Битовая последовательность информации о формате
Рисунок 2 – Битовая последовательность информации о формате

Примечание: этап заполнения битовой последовательности информации о формате кодовой битовой комбинацией в представленном алгоритме будет пятым, после определения маски.

Второй не менее важный элемент М2 – маршрут последовательности заполнения битами данных поля матрицы (рис. 3). Данная схема отражена на рисунке 11 ГОСТ.

Рисунок 3 – Маршрут последовательности записи бит кода М2
Рисунок 3 – Маршрут последовательности записи бит кода М2

Если наложить маршрут на матрицу, получаем последовательность из 80 бит кода М2 (рис. 4). Число 80 пригодится чуть позже при работе с кодами Рида-Соломона.

Рисунок 4 – Кодовая последовательность на матричном поле М2
Рисунок 4 – Кодовая последовательность на матричном поле М2

Переходим к реализации первого этапа – получение кодовой комбинации исходного текста. В системе QR Code существует несколько разновидностей кодирования: числовой, алфавитно-цифровой, байтовый, кандзи, структурированное соединение и FNC1. Самые простые – числовой (число определенной длины из цифр 0..9) и алфавитно-цифровой (табл. 1).

Таблица 1 – Кодирование/декодирование для алфавитно-цифрового режима (Таблица 5 ГОСТ)

Знак

Значение

Знак

Значение

Знак

Значение

Знак

Значение

Знак

Значение

Знак

Значение

Знак

Значение

Знак

Значение

0

0

6

6

С

12

I

18

О

24

U

30

SP

36

.

42

1

1

7

7

D

13

J

19

Р

25

V

31

$

37

/

43

2

2

8

8

Е

14

К

20

Q

26

W

32

%

38

:

44

3

3

9

9

F

15

L

21

R

27

X

33

*

39

 

 

4

4

А

10

G

16

М

22

S

28

Y

34

+

40

 

 

5

5

В

11

Н

17

N

23

Т

29

Z

35

-

41

 

 

В данной таблице есть одна особенность – используется исключительно латиница верхнего регистра, т.е. большие буквы.

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

Используем числовую систему кодирования для выполнения требований задания. Следующее ограничение – необходимо кодировать ровно 8 цифровых символов. М2 поддерживает два уровня исправления ошибок – L и M. Обращаемся к таблице 7 ГОСТ, получаем, что уровни L и M поддерживают емкость 8 цифровых символов (табл. 2, емкость данных для цифрового режима). Более оптимальный будет уровень М, но в ГОСТ выбран уровень L (логически это не объяснить, но будем придерживаться ГОСТ). Выбор уровня исправления ошибок L будет отражен позже на пятом этапе в битовой последовательности информации о формате (рис. 2).

Таблица 2 – Число знаков символа и емкость входных данных для QR Code (Таблица 7 ГОСТ)

Версия

Уровень исправления ошибок

Число кодовых слов данных

Число битов для данных

Емкость данных для разных режимов

Цифровой

Алфавитно-цифровой

Байтовый

Кандзи

М1

Только обнаружение ошибок

3

20

5

-

-

-

М2

L

5

40

10

6

-

-

М

4

32

8

5

-

-

М3

L

11

84

23

14

9

6

М

9

68

18

11

7

4

М4

L

16

128

35

21

15

9

М

14

112

30

18

13

8

Q

10

80

21

13

9

5

Воспользуемся алгоритмом, представленном в ГОСТ (п. 7.4.3). Разбиваем строку на группы по три цифры и преобразуем каждую группу из десятичного числа в 10-битовый двоичный эквивалент для трех цифр, в 7-битовый двоичный эквивалент для двух цифр и в 4-битовый двоичный эквивалент для одной цифры. Для данного примера получаем:

-     012 → 0000001100;

-     345 → 0101011001;

-     67 → 1000011;

Создадим в MS Excel новый пустой Лист. Пример готового результата представлен на рисунке 5.

Рисунок 5 – Лист кодирования исходной информации
Рисунок 5 – Лист кодирования исходной информации

Для автоматизации первого этапа сначала переносим таблицу набор цифр, начиная с ячейки (2, 2). Резервируем 4 строчку, начиная с ячейки (4, 2) для исходных данных. Объединяем ячейки (4, 2) и (4, 3). Добавляем функцию:

=R[-2]C&R[-2]C[1]&R[-2]C[2]

В строке 4 объединяем ячейки с 5 по 8. В ячейку (4, 5) добавляем функцию:

=ДЕС.В.ДВ(RC[-3];10)

Аналогично заполняем ячейки в строках 5 и 6:

Ячейка

Значение

(5, 2)-(5, 3)

=R[-3]C[3]&R[-3]C[4]&R[-3]C[5]

(5, 5)-(5, 8)

=ДЕС.В.ДВ(RC[-3];10)

(6, 2)-(6, 3)

=R[-4]C[6]&R[-4]C[7]

(6, 5)-(6, 8)

=ДЕС.В.ДВ(RC[-3];7)

Далее необходимо объединить все три полученные бинарные кодовые последовательности в одну. В 8 строке объединяем ячейки с 2 по 12. В ячейку (8, 2) добавляем:

=R[-4]C[3]&R[-3]C[3]&R[-2]C[3]

Полученная кодовая комбинация (рис. 6):

000000110001010110011000011

Рисунок 6 – Пример текущего результата
Рисунок 6 – Пример текущего результата

К полученной кодовой комбинации необходимо добавить служебную информацию: индикатор цифрового режима для вер. М2 и число знаков (в данном случае 8 знаков – 01234567). Воспользуемся таблицами 2 и 3 ГОСТ. В таблице индикаторов режима (табл. 3) определяем, что индикатор цифрового режима для вер. М20. В таблице числа битов в индикаторе числа знаков (табл. 4) определяем, что выделяется четыре бита на описание числа знаков, т.е. число 8 будет представлено как 1000.

Таблица 3 – Индикаторы режима для QR Code (Таблица 2 ГОСТ)

Режим

Символы QR Code

Символы Micro QR Code

версия

любой версии

М1

М2

М3

M4

Длина индикатора режима, биты

4

0

1

2

3

ECI

0111

n/a

n/a

n/a

n/a

Числовой

0001

n/a

0

00

000

Алфавитно-цифровой

0010

n/a

1

01

001

Байтовый

0100

n/a

n/a

10

010

Кандзи

1000

n/a

n/a

11

011

Структурированное соединение

0011

n/a

n/a

n/a

n/a

FNC1a

0101 (1-я позиция)

n/a

n/a

n/a

n/a

1001 (2-я позиция)

Ограничитель (конец сообщения)

0000

000

00000

0000000

000000000

Таблица 4 – Число битов в индикаторе числа знаков для QR Code (Таблица 3 ГОСТ)

Версия

Числовой режим

Алфавитно-цифровой режим

Байтовый режим

Режим кандзи

M1

3

n/a

n/a

n/a

М2

4

3

n/a

n/a

М3

5

4

4

3

M4

6

5

5

4

1-9

10

9

8

8

10-26

12

11

16

10

27-40

14

13

16

12

Для проверки воспользуемся функцией (рис. 7). В ячейку (11, 11)-(11, 12) добавляем функцию:

=ДЕС.В.ДВ(RC[-1];4)

Рисунок 7 – Добавлена служебная информация
Рисунок 7 – Добавлена служебная информация

Объединяем служебную информацию и исходный код в единую последовательность:

0 1000 000000110001010110011000011

Объединяем ячейки (13, 2)-(13, 13). В полученную ячейку (13, 2) добавляем код:

=R[-3]C[8]&R[-2]C[9]&R[-5]C

Результат формирования текущей битовой последовательности представлен на рисунке 8.

Рисунок 8 – Текущий результат битовой последовательности
Рисунок 8 – Текущий результат битовой последовательности

Для дальнейшей работы с кодами Рида-Соломона (2 этап) необходимо сделать полученную последовательность из 5 символов (табл. 2, число кодовых слов данных для режима M2-L равно 5) по количеству символов кратной 8, т.е. добавить биты ограничители (по табл. 3, максимальное количество для М2 равно пяти нулям) и биты заполнители. В текущей битовой последовательности в ячейке (13, 2) ровно 32 символа. Для кратности 8 добавляем пять битов ограничителя – 00000 и, т.к. все равно не делится на 8, добавляем 3 бита заполнителя – 000 (рис. 10):

01000000000110001010110011000011 00000 000

Объединяем ячейки (15, 10)-(15, 13). Добавляем в ячейку (15, 10) 00000. Объединяем ячейки (16, 10)-(16, 13). Добавляем в ячейку (16, 10) 000. В строке 18 объединяем ячейки со 2 по 16. В полученную ячейку (18, 2) добавляем следующий код:

=R[-5]C&R[-3]C[8]&R[-2]C[8]

В результате, итоговая последовательность в ячейке (17, 2) представлена как:

0100000000011000101011001100001100000000

Повторно проверяем по таблице 2 (ГОСТ Таблица 7) насколько получилась правильная комбинация. Напротив строки M2-L в столбце «Число кодовых слов данных» указано число 5, т.е. должно получиться 5 частей по 8 бит – 01000000 00011000 10101100 11000011 00000000. Следовательно, полученная последовательность полностью соответствует требованиям ГОСТ.

Для разделения итоговой битовой комбинации на пять 8-битных последовательностей воспользуемся командой =ПСТР(ссылка на ячейку; позиция первого символа; количество бит). Получаем следующие комбинации (рис. 10):

Диапазон ячеек

Значение

(14, 18)-(14, 22)

=ПСТР(R[4]C[-16];1;8)

(15, 18)-(15, 22)

=ПСТР(R[3]C[-16];9;8)

(16, 18)-(16, 22)

=ПСТР(R[2]C[-16];17;8)

(17, 18)-(17, 22)

=ПСТР(R[1]C[-16];25;8)

(18, 18)-(18, 22)

=ПСТР(RC[-16];33;8)

Для визуализации полученного результата, перенесем полученную битовую комбинацию в шаблон Micro QR Code вер. М2 (рис. 9).

Рисунок 9a – Черновик Micro QR Code (последовательность)
Рисунок 9a – Черновик Micro QR Code (последовательность)
Рисунок 9b – Черновик Micro QR Code (без последовательности)
Рисунок 9b – Черновик Micro QR Code (без последовательности)

Для перехода ко 2 этапу необходимо перевести полученные 8-битовые комбинации в десятичный вид. Воспользуемся командой =ДВ.В.ДЕС(ссылка на ячейку), получаем последовательность чисел (рис. 10):

64, 24, 172, 195, 0

Диапазон ячеек

Значение

(14, 23)-(14, 24)

=ДВ.В.ДЕС(RC[-5])

(15, 23)-(15, 24)

=ДВ.В.ДЕС(RC[-5])

(16, 23)-(16, 24)

=ДВ.В.ДЕС(RC[-5])

(17, 23)-(17, 24)

=ДВ.В.ДЕС(RC[-5])

(18, 23)-(18, 24)

=ДВ.В.ДЕС(RC[-5])

Рисунок 10 – Итог первого этапа кодирования
Рисунок 10 – Итог первого этапа кодирования

Итак, итоговая комбинация: 64, 24, 172, 195, 0. Можно переходить ко 2 этапу.

Этап 2. Генерация кодовых слов исправления ошибок

Для генерации кодовых слов исправления ошибок необходимо использовать алгоритм Рида-Соломона на поле Галуа GF(28).

Примечание: для самых любопытных, если интересно посмотреть с точки зрения алгебры множеств то, что будет описываться дальше на примере в таблице MS Excel, можно посмотреть/изучить достаточно хороший материал на Хабр:

[1] Код Рида-Соломона

[2] Кодирование Рида-Соломона для чайников

[3] Арифметика полей Галуа для кодирования информации кодами Рида-Соломона

В данном материале математику изучать не будет, но будем применять во всей красоте магии чисел.

Создаем новый Лист в Книге MS Excel. Забегая вперед, демонстрация результата (рис. 11).

Рисунок 11 – Пример полученного результата
Рисунок 11 – Пример полученного результата

Для деления полиномов будем использовать поле Галуа GF(28) и обратное поле Галуа GF(28) – обязательное требование при работе с QR Code в ГОСТ. Можно просто переписать большую таблицу значений в ячейки, но предполагалась автоматизация. Следовательно, воспользуемся простыми функциями для создания полей.

Поле Галуа GF(28) представляет фиксированный набор из 256 чисел в диапазоне от 0 до 255. Сначала зададим простой ряд натуральных чисел от 0 до 255 в строке 2. В ячейке (2, 2) – 0, в (2, 3) – 1, в (2, 4) – 2 и т.д. до ячейки (2, 257) – 255. Заполняем третью строку. Первая часть идет с простыми значениями:

Ячейка

Значение

(3, 2)

1

(3, 3)

2

(3, 4)

=RC[-1]*2

(3, 5)

=RC[-1]*2

(3, 6)

=RC[-1]*2

(3, 7)

=RC[-1]*2

(3, 8)

=RC[-1]*2

(3, 9)

=RC[-1]*2

На этом простая часть закончилась, дальше чуть посложнее. Начиная с ячейки (3, 10) необходимо во все последующие ячейки до (3, 257) добавить следующую функцию:

=ЕСЛИ(2*RC[-1]>254;БИТ.ИСКЛИЛИ(2*RC[-1];285);RC[-1]*2)

где добавлено условие: если значение из предыдущей ячейки умноженное на 2 превышает 254, то необходимо выполнить XOR с числом 285. Почему именно 285 описано в статьях по ссылкам выше. Если число меньше 254, то просто оставляем в текущей ячейке умноженное на 2 полученное значение.

Для контроля полученного результата можно воспользоваться рисунком 11.

Обратное поле Галуа GF(28) аналогично представляет фиксированный набор из 256 чисел в диапазоне от 0 до 255. Сначала зададим простой ряд натуральных чисел от 0 до 255 в шестой строке. В ячейке (6, 2) – 0, в (6, 3) – 1, в (6, 4) – 2 и т.д. до ячейки (6, 257) – 255. Заполняем седьмую строку. В ячейке (7, 2) – ставим прочерк. Данного значения не существует. Ячейки (7, 3) – (7, 257) заполняем функцией:

=ИНДЕКС(R2C2:R2C257;ПОИСКПОЗ(R[-1]C;R3C2:R3C257;0))

где производится поиск по индексу шестой строки соответствующего значения в поле Галуа GF(28). Для контроля полученного результата также можно воспользоваться рисунком 11. В результате оба поля должны быть созданы в полном объеме.

Переходим к основному действию – деление полиномов. Сначала необходимо определить уровень корректирующего полинома. На первом этапе получили максимальное количество бит на поле М2 (рис. 4) – 80 бит. Далее определили последовательность бит исходных данных со служебной информацией (рис. 10) – 5 значений по 8 бит (итого – 40). Следовательно, корректирующий код исправления ошибок также должен состоять из 40 бит (80-40=40 бит) или 5 чисел по 8 бит. И здесь начинаются странности с ГОСТ.

Примечание: не ищите в ГОСТ алгоритма определения необходимого количества бит корректирующего кода исправления ошибок. В оригинале ISO тоже нет.

Примечание: все необходимые коэффициенты полиномов можно найти в форме степеней в приложении А ГОСТ, таблица А.1. Но в ГОСТ не описан механизм применения.

Обращаемся к таблице А.1 ГОСТ. Полином 5 уровня имеет коэффициенты 113, 164, 166, 119, 10.

Все необходимые исходные данные для деления полиномов готовы, переходим к практической составляющей.

Примечание: разные комбинации (длина битовой комбинации исходных данных больше длины битовой комбинации корректирующего полинома или длина битовой комбинации исходных данных меньше длины битовой комбинации корректирующего полинома) имеют разные алгоритмы реализации. Далее будет описан алгоритм, когда длины совпадают.

Возвращаемся к битовой комбинации исходных данных (рис. 10). И переносим в ячейки текущего Листа Книги MS Excel (рис. 11):

Ячейка

Значение

(13, 24)

64

(13, 25)

24

(13, 26)

172

(13, 27)

195

(13, 28)

0

Заполняем 15 строку значениями (коэффициентами) корректирующего полинома (рис. 11):

Ячейка

Значение

(15, 24)

113

(15, 25)

164

(15, 26)

166

(15, 27)

119

(15, 28)

10

Каждый этап деления будет состоять из 4 последовательных шагов. Каждый шаг будет описан отдельно. Переходим на 16 строку. Ячейка (16, 23):

=ИНДЕКС(R7C2:R7C257;ПОИСКПОЗ(R[-3]C[1];R6C2:R6C257;0))

где ищем значение первого числа исходного кода (64) в обратном поле Галуа GF(28). Получаем результат – 6.

В ячейки (16, 24)-(16, 28) прописываем следующую функцию:

=ОСТАТ(R[-1]C+R16C23;255)

В результате получаем ряд чисел:

119, 170, 172, 125, 16

Переходим к 17 строке. Ячейки (17, 23)-(17, 28) заполняем следующей функцией:

=ИНДЕКС(R3C2:R3C257;ПОИСКПОЗ(R[-1]C;R2C2:R2C257;0))

В результате получаем ряд чисел:

64, 147, 215, 123, 51, 76

Переходим к 18 строке. Ячейки (18, 23)-(18, 28) заполняем следующей функцией:

=R[-5]C[1]

В результате получаем ряд чисел:

64, 24, 172, 195, 0, 0

Переходим к 19 строке. Ячейки (19, 23)-(19, 28) заполняем следующей функцией:

=БИТ.ИСКЛИЛИ(R[-2]C;R[-1]C)

В результате получаем ряд чисел:

0, 139, 123, 184, 51, 76

Первый этап деления выполнен. Все 4 шага описаны. Всего количество этапов будет 5 – по количеству значений исходного кода.

 Переходим на 20 строку. Ячейка (20, 23):

=ИНДЕКС(R7C2:R7C257;ПОИСКПОЗ(R[-1]C[1];R6C2:R6C257;0))

где ищем значение первого числа переходного кода (139) в обратном поле Галуа GF(28). Получаем результат – 237.

В ячейки (20, 24)-(20, 28) прописываем следующую функцию:

=ОСТАТ(R15C+R20C23;255)

В результате получаем ряд чисел:

95, 146, 148, 101, 247

Переходим к 21 строке. Ячейки (21, 23)-(21, 28) заполняем следующей функцией:

=ИНДЕКС(R3C2:R3C257;ПОИСКПОЗ(R[-1]C;R2C2:R2C257;0))

В результате получаем ряд чисел:

139, 226, 154, 82, 34, 131

Переходим к 22 строке. Ячейки (22, 23)-(22, 28) заполняем следующей функцией:

=R[-3]C[1]

В результате получаем ряд чисел:

139, 123, 184, 51, 76, 0

Переходим к 23 строке. Ячейки (23, 23)-(23, 28) заполняем следующей функцией:

=БИТ.ИСКЛИЛИ(R[-2]C;R[-1]C)

В результате получаем ряд чисел:

0, 153, 34, 97, 110, 131

Второй этап деления выполнен.

 Переходим на 24 строку. Ячейка (24, 23):

=ИНДЕКС(R7C2:R7C257;ПОИСКПОЗ(R[-1]C[1];R6C2:R6C257;0))

где ищем значение первого числа переходного кода (153) в обратном поле Галуа GF(28). Получаем результат – 68.

В ячейки (24, 24)-(24, 28) прописываем следующую функцию:

=ОСТАТ(R15C+RC23;255)

В результате получаем ряд чисел:

181, 232, 234, 187, 78

Переходим к 25 строке. Ячейки (25, 23)-(25, 28) заполняем следующей функцией:

=ИНДЕКС(R3C2:R3C257;ПОИСКПОЗ(R[-1]C;R2C2:R2C257;0))

В результате получаем ряд чисел:

153, 49, 247, 251, 220, 120

Переходим к 26 строке. Ячейки (26, 23)-(26, 28) заполняем следующей функцией:

=R[-3]C[1]

В результате получаем ряд чисел:

153, 34, 97, 110, 131, 0

Переходим к 27 строке. Ячейки (27, 23)-(27, 28) заполняем следующей функцией:

=БИТ.ИСКЛИЛИ(R[-2]C;R[-1]C)

В результате получаем ряд чисел:

0, 19, 150, 149, 95, 120

Третий этап деления выполнен.

 Переходим на 28 строку. Ячейка (28, 23):

=ИНДЕКС(R7C2:R7C257;ПОИСКПОЗ(R[-1]C[1];R6C2:R6C257;0))

где ищем значение первого числа переходного кода (19) в обратном поле Галуа GF(28). Получаем результат – 14.

В ячейки (28, 24)-(28, 28) прописываем следующую функцию:

=ОСТАТ(R15C+RC23;255)

В результате получаем ряд чисел:

127, 178, 180, 133, 24

Переходим к 29 строке. Ячейки (29, 23)-(29, 28) заполняем следующей функцией:

=ИНДЕКС(R3C2:R3C257;ПОИСКПОЗ(R[-1]C;R2C2:R2C257;0))

В результате получаем ряд чисел:

19, 204, 171, 150, 109, 143

Переходим к 30 строке. Ячейки (30, 23)-(30, 28) заполняем следующей функцией:

=R[-3]C[1]

В результате получаем ряд чисел:

19, 150, 149, 95, 120, 0

Переходим к 31 строке. Ячейки (31, 23)-(31, 28) заполняем следующей функцией:

=БИТ.ИСКЛИЛИ(R[-2]C;R[-1]C)

В результате получаем ряд чисел:

0, 90, 62, 201, 21, 143

Четвертый этап деления выполнен.

 Переходим на 32 строку. Ячейка (32, 23):

=ИНДЕКС(R7C2:R7C257;ПОИСКПОЗ(R[-1]C[1];R6C2:R6C257;0))

где ищем значение первого числа переходного кода (90) в обратном поле Галуа GF(28). Получаем результат – 19.

В ячейки (32, 24)-(32, 28) прописываем следующую функцию:

=ОСТАТ(R15C+RC23;255)

В результате получаем ряд чисел:

132, 183, 185, 138, 29

Переходим к 33 строке. Ячейки (33, 23)-(33, 28) заполняем следующей функцией:

=ИНДЕКС(R3C2:R3C257;ПОИСКПОЗ(R[-1]C;R2C2:R2C257;0))

В результате получаем ряд чисел:

90, 184, 196, 55, 33, 48

Переходим к 34 строке. Ячейки (34, 23)-(34, 28) заполняем следующей функцией:

=R[-3]C[1]

В результате получаем ряд чисел:

90, 62, 201, 21, 143, 0

Переходим к 35 строке. Ячейки (35, 23)-(35, 28) заполняем следующей функцией:

=БИТ.ИСКЛИЛИ(R[-2]C;R[-1]C)

В результате получаем ряд чисел:

0, 134, 13, 34, 174, 48

Заключительный пятый этап деления выполнен.

Итак, вторая часть битовой комбинации кода получена. Далее необходимо первую и вторую часть перевести в двоичную комбинацию и получить итоговую битовую последовательность.

Переносим две исходные последовательности в столбики в ячейки:

Ячейка

Значение

Ячейка

Значение

(17, 5)-(17, 6)

64

(17, 14)-(17, 15)

134

(18, 5)-(18, 6)

24

(18, 14)-(18, 15)

13

(19, 5)-(19, 6)

172

(19, 14)-(19, 15)

34

(20, 5)-(20, 6)

195

(20, 14)-(20, 15)

174

(21, 5)-(21, 6)

0

(21, 14)-(21, 15)

48

Получаем два столбика двоичных последовательностей (рис. 11):

Ячейка

Значение

Ячейка

Значение

(17, 8)-(17, 11)

=ДЕС.В.ДВ(RC[-3];8)

(17, 17)-(17, 20)

=ДЕС.В.ДВ(RC[-3];8)

(18, 8)-(18, 11)

=ДЕС.В.ДВ(RC[-3];8)

(18, 17)-(18, 20)

=ДЕС.В.ДВ(RC[-3];8)

(19, 8)-(19, 11)

=ДЕС.В.ДВ(RC[-3];8)

(19, 17)-(19, 20)

=ДЕС.В.ДВ(RC[-3];8)

(20, 8)-(20, 11)

=ДЕС.В.ДВ(RC[-3];8)

(20, 17)-(20, 20)

=ДЕС.В.ДВ(RC[-3];8)

(21, 8)-(21, 11)

=ДЕС.В.ДВ(RC[-3];8)

(21, 17)-(21, 20)

=ДЕС.В.ДВ(RC[-3];8)

В 23 строке объединяем ячейки (23, 4)-(23, 12) и (23, 13)-(23, 21). В ячейку (23, 4) добавляем функцию:

=R[-6]C[3]&R[-5]C[3]&R[-4]C[3]&R[-3]C[3]&R[-2]C[3]

И в ячейку (23, 13) добавляем функцию:

=R[-6]C[3]&R[-5]C[3]&R[-4]C[3]&R[-3]C[3]&R[-2]C[3]

В 25 строке объединяем ячейки (25, 4)-(25, 21). В ячейку (25, 4) добавляем функцию:

=R[-2]C&R[-2]C[9]

Пример итогового варианта представлен на рисунке 12.

Рисунок 12 – Итоговый вариант полученной комбинации
Рисунок 12 – Итоговый вариант полученной комбинации

Этап 3. Размещение модулей в матрице символа

Шаблон поиска и шаблоны синхронизации размещают в пустой матрице 13×13, а модули в позиции для информации о формате временно оставляют пустыми. Кодовые слова, полученные на этапах 1 и 2 (табл. 5), размещают в матрице в соответствии с п. 7.7.3 ГОСТ, в результате получают символ, приведенный на рис. 13.

Таблица 5 – Кодовые слова

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

0

1

0

0

0

0

0

0

0

0

0

1

1

0

0

0

1

0

1

0

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

1

1

0

0

1

1

0

0

0

0

1

1

0

0

0

0

0

0

0

0

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

1

0

0

0

0

1

1

0

0

0

0

0

1

1

0

1

0

0

1

0

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

0

0

1

0

1

0

1

0

1

1

1

0

0

0

1

1

0

0

0

0

Рисунок 13a – Размещение модулей данных в символе до маскирования данных (последовательность)
Рисунок 13a – Размещение модулей данных в символе до маскирования данных (последовательность)
Рисунок 13b – Размещение модулей данных в символе до маскирования данных (без последовательности)
Рисунок 13b – Размещение модулей данных в символе до маскирования данных (без последовательности)

Этап 4. Выбор шаблона маски данных

Для выбора наиболее удачного варианта применяются шаблоны маски данных согласно п. 7.8.2 ГОСТ по очереди и оценивают результаты по п. 7.8.3 ГОСТ. Рассмотрим последовательно описанный в пунктах ГОСТ процесс для данного примера. Создаем новый Лист в Книге MS Excel.

На рисунке 22 ГОСТ представлены маски для Micro QR Code, вычисляемые по формулам таблицы 10 ГОСТ (табл. 6).

Таблица 6 – Условия генерации шаблона маски данных

Указатель шаблона маски данных для символов QR Code

Указатель шаблона маски данных для символов Micro QR Code

Условие

000

 

(i + j) mod 2 = 0

001

00

i mod 2 = 0

010

 

j mod 3 = 0

011

 

(i + j) mod 3 = 0

100

01

((i div 2) + (j div 3)) mod 2 = 0

101

 

(ij) mod 2 + (ij) mod 3 = 0

110

10

((ij) mod 2 + (ij) mod 3) mod 2 = 0

111

11

((i + j) mod 2 + (i + j) mod 3) mod 2 = 0

Можно процесс наполнения масок бинарными данными автоматизировать, но в данной постановке решено пропустить этап и заполнить маски вручную. Для любопытных, подсказка, как можно автоматизировать (рис. 14).

Рисунок 14 – Подсказка для автоматизации процесса создания масок
Рисунок 14 – Подсказка для автоматизации процесса создания масок

Переносим указанные в табл. 6 маски на новый Лист MS Excel (рис. 15).

Рисунок 15 – Маски для М2
Рисунок 15 – Маски для М2

Примечание: MS Excel не умеет работать с цветами ячеек. Для дальнейшей автоматизации во всех ячейках масок белые биты подписаны нулями (0), черные – единицами (1).

Бинарную матрицу предыдущего этапа (рис. 13) также переводим в бинарный вид (рис. 16).

Рисунок 16 – Бинарная матрица исходных данных (справа)
Рисунок 16 – Бинарная матрица исходных данных (справа)

Имеются 4 маски и исходник по полученным данным. Позиции верхних левых углов:

-     маска 00 – ячейка (4, 4);

-     маска 01 – ячейка (4, 20);

-     маска 10 – ячейка (20, 4);

-     маска 11 – ячейка (20, 20);

-     исходные данные – ячейка (4, 36).

Добавляем четыре заготовки для будущих маскированных вариантов (рис. 17). Позиции верхних левых углов заготовок (4, 52), (4, 68), (20, 52) и (20, 68).

Рисунок 17 – Заготовка для маскирования данных
Рисунок 17 – Заготовка для маскирования данных

Пример полученного результата представлен на рисунке 18.

Рисунок 18 – Пример расположения заготовок для маскирования М2
Рисунок 18 – Пример расположения заготовок для маскирования М2

В ячейку (5, 61) добавляем следующую функцию:

=БИТ.ИСКЛИЛИ(RC[-48];RC[-16])

Если все сделано корректно, то в ячейке должна появиться цифра один (1). Дальше за нижний правый угол выделенной ячейки (магический квадрат MS Excel) заполняем все остальные ячейки матрицы (00).

 В ячейку (5, 77) добавляем следующую функцию:

=БИТ.ИСКЛИЛИ(RC[-48];RC[-32])

Если все сделано корректно, то в ячейке должна появиться цифра один (1). Дальше за нижний правый угол выделенной ячейки (магический квадрат MS Excel) заполняем все остальные ячейки матрицы (01).

 В ячейку (21, 61) добавляем следующую функцию:

=БИТ.ИСКЛИЛИ(RC[-48];R[-16]C[-16])

Если все сделано корректно, то в ячейке должна появиться цифра один (1). Дальше за нижний правый угол выделенной ячейки (магический квадрат MS Excel) заполняем все остальные ячейки матрицы (10).

 В ячейку (21, 77) добавляем следующую функцию:

=БИТ.ИСКЛИЛИ(RC[-48];R[-16]C[-32])

Если все сделано корректно, то в ячейке должна появиться цифра один (0). Дальше за нижний правый угол выделенной ячейки (магический квадрат MS Excel) заполняем все остальные ячейки матрицы (11).

Пример результата маскирования представлен на рисунке 19.

Рисунок 19 – Пример результата маскирования
Рисунок 19 – Пример результата маскирования

Следующий этап – оценка символов Micro QR Code (п. 7.8.3.2 ГОСТ). После выполнения операции маскирования данных в области кодирования символа с каждым шаблоном маски данных оценивают результат, подсчитывая множество темных модулей в каждой из двух границ, которые не содержат шаблоны синхронизации. Чем меньше число темных модулей, тем менее приемлемым является результат. В таких символах рекомендуется иметь больше темных модулей на границе, чтобы более эффективно отличать свободную зону от области кодирования.

Для каждого шаблона маски данных подсчитывают число темных модулей в правой и нижней границах символа (исключая последний модуль шаблона синхронизации). Оценку результата подсчета производят следующим образом (рис. 20):

 если SUM1 <= SUM2;

то оценка = SUM1 x 16 + SUM2;

если SUM1 > SUM2;

то оценка = SUM1 + SUM2 x 16;

 где SUM1 – число темных модулей на правой границе;

SUM2 – число темных модулей на нижней границе.

Рисунок 20 – Пример оценки результата маскирования
Рисунок 20 – Пример оценки результата маскирования

Реализуем данную схему на Листе. Пример полученного результата представлен на рисунке 21.

Рисунок 21 – Пример результата расчетов
Рисунок 21 – Пример результата расчетов

Заполняем ячейки определения количества единиц (1) в правом столбике и нижней строчки каждой матрицы:

Ячейка

Функция

(4, 87)

=СЧЁТЕСЛИ(R[1]C[-23]:R[12]C[-23];1)

(4, 88)

=СЧЁТЕСЛИ(R[12]C[-35]:R[12]C[-24];1)

(5, 87)

=СЧЁТЕСЛИ(RC[-7]:R[11]C[-7];1)

(5, 88)

=СЧЁТЕСЛИ(R[11]C[-19]:R[11]C[-8];1)

(6, 87)

=СЧЁТЕСЛИ(R[15]C[-23]:R[26]C[-23];1)

(6, 88)

=СЧЁТЕСЛИ(R[26]C[-35]:R[26]C[-24];1)

(7, 87)

=СЧЁТЕСЛИ(R[14]C[-7]:R[25]C[-7];1)

(7, 88)

=СЧЁТЕСЛИ(R[25]C[-19]:R[25]C[-8];1)

Заполняем ячейки определения критерия оценки для каждой матрицы:

Ячейка

Функция

(4, 89)-(4, 90)

=ЕСЛИ(RC[-1]<RC[-2];RC[-1]*16+RC[-2];RC[-2]*16+RC[-1])

(5, 89)-(5, 90)

=ЕСЛИ(RC[-1]<RC[-2];RC[-1]*16+RC[-2];RC[-2]*16+RC[-1])

(6, 89)-(6, 90)

=ЕСЛИ(RC[-1]<RC[-2];RC[-1]*16+RC[-2];RC[-2]*16+RC[-1])

(7, 89)-(7, 90)

=ЕСЛИ(RC[-1]<RC[-2];RC[-1]*16+RC[-2];RC[-2]*16+RC[-1])

Выбирают шаблон маски, имеющий наибольший результат. Находим максимум из полученных вариантов. В ячейку (8,89)-(8,90) добавляем функцию:

=МАКС(R[-4]C:R[-1]C[1])

Проверяем полученный результат с примером на рисунке 21. В результате должно получиться число 136. Т.е. для данного символа рекомендуется использовать шаблон маски данных с обозначением 01 или 10 (табл. 10). В ГОСТ выбрана первая по счету маска – 01. Применяем выбранный шаблон маски данных к области кодирования в матрице согласно п. 7.8 ГОСТ.

 Этап 5. Подготовка информации о формате

В качестве исходных данных используются два показателя:

-      для символа версии M2-L номер равен 1, что в двоичном виде данных – 001 по таблице 13 ГОСТ (табл. 7);

-      полученный на 4 этапе шаблон маски – 01.

Таблица 7 – Номер символа для Micro QR Code

Номер символа

Версия

Уровень исправления ошибок

Двоичный индикатор

0

М1

Только обнаружение

000

1

М2

L

001

2

М2

М

010

3

М3

L

011

4

М3

М

100

5

М4

L

101

6

М4

М

110

7

М4

Q

111

 

В результате получают биты данных в информации о формате 001 01:

00101

По таблице С.1 ГОСТ (табл. 8) находим соответствующую битовые последовательности информации о формате. Для данного примера – 101000010011001.

Hidden text

Таблица 8 – Надлежащие битовые последовательности информации о формате

Последовательность до маскирования

Последовательность после маскирования (символы Micro QR Code)

Биты данных

Биты исправления ошибок

Двоичная

Шестнадцатеричная

00000

0000000000

100010001000101

4445

00001

0100110111

100000101110010

4172

00010

1001101110

100111000101011

4Е2В

00011

1101011001

100101100011100

4В1С

00100

0111101011

101010110101110

55АЕ

00101

0011011100

101000010011001

5099

00110

1110000101

101111111000000

5FC0

00111

1010110010

101101011110111

5AF7

01000

1111010110

110011110010011

6793

01001

1011100001

110001010100100

62А4

01010

0110111000

110110111111101

6DFD

01011

0010001111

110100011001010

68СА

01100

1000111101

111011001111000

7678

01101

1100001010

111001101001111

734F

01110

0001010011

111110000010110

7С16

01111

0101100100

111100100100001

7921

10000

1010011011

000011011011110

06DE

10001

1110101100

000001111101001

03Е9

10010

0011110101

000110010110000

0CB0

10011

0111000010

000100110000111

0987

10100

1101110000

001011100110101

1735

10101

1001000111

001001000000010

1202

10110

0100011110

001110101011011

1D5B

10111

0000101001

001100001101100

186С

11000

0101001101

010010100001000

2508

11001

0001111010

010000000111111

203F

11010

1100100011

010111101100110

2F66

11011

1000010100

010101001010001

2А51

11100

0010100110

011010011100011

34E3

11101

0110010001

011000111010100

31D4

11110

1011001000

011111010001101

3E8D

11111

1111111111

011101110111010

ЗВВА

 

Этап 6. Заключительное формирование символа

Добавляем модули информации о формате в позиции, зарезервированные на этапе 3, с 14 бита по 0 бит (рис. 22).

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

1

0

1

0

0

0

0

1

0

0

1

1

0

0

1

Рисунок 22 – Маска заполнения битовые последовательности информации о формате
Рисунок 22 – Маска заполнения битовые последовательности информации о формате

В результате получаем завершенный символ, приведенный на рис. 23.

Рисунок 23 – Окончательный вид символа версии M2-L
Рисунок 23 – Окончательный вид символа версии M2-L

Можно проверить полученный результат на любом онлайн сканере в сети Интернет. Выделяем в MS Excel полученный код и копируем через буфер обмена в MS Word как рисунок. В MS Word сохраняем полученный рисунок как внешний графический файл в формате .png. Загружаем произвольный онлайн сканер (например) и проверяем полученный Micro QR Code.

Комментарии (7)


  1. WondeRu
    06.01.2024 19:38
    +4

    Жизнь слишком коротка, чтобы генерировать QR-коды в Excel.


    1. Tschuess
      06.01.2024 19:38

      Уровень статьи обозначен как "простой".Что же будет показано в следующих уровнях...


      1. datacase
        06.01.2024 19:38
        +1

        Генерация QR-кодов в Блокноте


      1. Litloc Автор
        06.01.2024 19:38

        А если не "простой", то какой надо?


        1. DrMefistO
          06.01.2024 19:38

          Ну, сложный, не?)


          1. Litloc Автор
            06.01.2024 19:38

            https://habr.com/ru/articles/785156/

            Пожелание выполнено. Уровень "сложный"


    1. Litloc Автор
      06.01.2024 19:38

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