Задача: необходимо прочитать Micro QR Code версии М1, содержащее кодовое слово, состоящее из цифр (на примерах – 7, 77, 777, 7777 и максимальное кодовое расстояние – 77777) на основе алгоритма, приведенного в ГОСТ Р ИСО/МЭК 18004-2015 (п. 7.4.3, пример 2). Данный режим невозможно прочитать стандартными ресурсами мобильных устройств, производимых GAFAM (как оказалось, свободно распространяемые библиотеки страшно глючат, поэтому Ассоциация отказалась от режима).
Примечание: здесь и далее будет использоваться информация ГОСТ Р ИСО/МЭК 18004-2015 или в оригинале ISO/IEC 18004:2015 (далее – ГОСТ).
Этап 0. Подготовка исходных данных
Рассмотрим М1 поближе. Имеем матрицу размерностью 11x11 бинарных символов (рис. 11 ГОСТ), один индикатор и два определителя (горизонтальный и вертикальный) (рис. 1).
Первый наносимый ограничитель символ на матрицу М1 – надлежащие битовые последовательности информации о формате (рис. 2). Чтение битовой последовательности начинается с 14 бита, т.е. последовательность чтения/записи будет 14, 13, 12, 11, 10 и т.д.
Второй не менее важный элемент М1 – маршрут последовательности заполнения битами данных поля матрицы (рис. 3). Данная схема отражена на рисунке 11 ГОСТ.
Если наложить маршрут на матрицу, получаем последовательность из 80 бит кода М1 (рис. 4). Число 36 пригодится чуть позже при добавлении кода по алгоритму Рида-Соломона на поле Галуа.
Примечание: здесь и далее будем использовать один из доступных программных инструментов Ассоциации практически на любом ПК – MS Excel (русскоязычная версия). Как следствие, все команды автоматизации процессов будут на кириллице.
Запускаем программное приложение MS Excel. Готовим последовательность листов Книги для дальнейшей работы:
Лист1 – называем Code;
Лист2 – M1 7;
Лист3 – M1 77;
Лист4 – M1 777;
Лист5 – M1 7777;
Лист6 – M1 77777.
Лист1 (Code) – для размещения корректирующих данных и сверки полученных на листах результатов. Остальные листы нужны для декодирования соответствующих последовательностей.
На листах с семерками (Лист2 – Лист6) делаем размерность ячеек одинаковой (например, 23 на 23 пикселя) и по горизонтали, и по вертикали (рис. 5a). Затем закрашиваем поле серым фоновым цветом (рис. 5b).
Примечание: для удобства дальнейшего описания ссылок на ячейки листа перейдем от современного отображения адресов ячеек в виде R1C1 (относительные ссылки) к старому формату в виде A1 (буквенно-числовое отображение). Выбираем в Меню Файл → Параметры. В категории Формулы в группе Работа с формулами снимаем галочку напротив пункта Стиль ссылок R1C1. В результате названия столбиков должны поменяться с чисел на латинские буквы (рис. 6).
Если посчитать количество пикселей (квадратиков) микрокода М1 (рис. 1) по горизонтали и/или по вертикали, то получится матрица (табличка) размерностью 11×11. Создадим новую схему шаблон для микрокода М1 на листах с семерками: Лист2 – Лист6 начиная с ячейки D4 (рис. 6).
Воспользуемся любым кодировщиком микрокодов в Интернет или рисунками далее для переноса битовой маски рабочего поля микрокода на листы книги MS Excel (рис. 7-9).
Каждый микрокод располагается на индивидуальном листе книги. Верхний левый угол каждого микрокода начинается в ячейке D4.
Исходные данные для декодирования готовы. Переходим к заполнению первого листа книги Code.
В системе QR Code существует несколько разновидностей кодирования: числовой, алфавитно-цифровой, байтовый, кандзи, структурированное соединение и FNC1.
Примечание: каждый из методов имеет ряд собственных особенностей. Не получится использовать предложенный ниже алгоритм для байтовых последовательностей или для кандзи.
Используем числовую систему кодирования для выполнения требований задания. Добавим требуемое ограничение – необходимо декодировать одну, две, три, четыре и пять последовательных цифр из двоичного кода. Необходимо также учесть, что М1 не поддерживает уровни исправления ошибок (таблица 7 ГОСТ, табл. 1, Уровень исправления ошибок), следовательно вариаций нет.
Таблица 1 – Число знаков символа и емкость входных данных для 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-битовый двоичный эквивалент. Бòльшие комбинации разбиваются на подгруппы из 3-х символов, остаточные биты – 2 или 1. Для примеров получаем:
- 77777 → 1100001001 и 1001101 (2 группы);
- 7777 → 1100001001 и 0111 (2 группы);
- 777 → 1100001001;
- 77 → 1001101;
- 7 → 0111;
Открываем лист Code. Пример готового результата представлен на рисунке 10.
Для автоматизации ячеек C3-C7 воспользуемся следующими функциями:
Ячейка |
Значение |
Ячейка |
Функция |
B3 |
7 |
C3 |
=ОСНОВАНИЕ(B3;2;4) |
B4 |
77 |
C4 |
=ОСНОВАНИЕ(B4;2;7) |
B5 |
777 |
C5 |
=ОСНОВАНИЕ(B5;2;10) |
B6 |
7777 |
C6 |
=C5&C3 |
B7 |
77777 |
C7 |
=C5&C4 |
Лист с корректирующими данными готов.
Переходим к основным микрокодам. Открываем лист книги М1 7 с исходным битовым полем (рис. 11a). К сожалению, за долгие годы MS Excel так и не научился работать с цветом ячеек. Добавим в каждую цветную ячейку соответствующее битовое значение: белая ячейка – 0, черная ячейка – 1 (рис. 11b).
Для удобства отделим цветом индикатор служебной информации (рис. 12a) – битовая последовательность информации о формате. Чтение последовательности начинается с 14 бита, т.е. последовательность чтения будет 14, 13, 12, 11, 10 и т.д.
Также отделяем цветом индикатор распознавания микрокода (рис. 12b).
Полученная матрица готова для дальнейшего анализа (рис. 13).
Переходим к первому этапу – работа со служебной информацией.
Этап 1. Служебная информация
Перед тем как начать работать с основной рабочей областью микрокода, необходимо расшифровать служебную информацию. Пример итогового результата приведен на рисунке 14.
Сначала переводим служебную информацию также в бинарное представление, т.е. ряды ячеек E12-L12 и L5-L12 представляем как набор 0 (светлые ячейки) и 1 (темные ячейки) (рис. 14).
Выносим служебную информацию из микрокода, т.е. дублируем полученный ряд в угловом представлении и в представлении – один ряд. Получаем следующие ссылочные ячейки:
Ячейка |
Функция |
Ячейка |
Функция |
P12 |
=E12 |
P14 |
=P12 |
Q12 |
=F12 |
Q14 |
=Q12 |
R12 |
=G12 |
R14 |
=R12 |
S12 |
=H12 |
S14 |
=S12 |
T12 |
=I12 |
T14 |
=T12 |
U12 |
=J12 |
U14 |
=U12 |
V12 |
=K12 |
V14 |
=V12 |
W12 |
=L12 |
W14 |
=W12 |
W11 |
=L11 |
X14 |
=W11 |
W10 |
=L10 |
Y14 |
=W10 |
W9 |
=L9 |
Z14 |
=W9 |
W8 |
=L8 |
AA14 |
=W8 |
W7 |
=L7 |
AB14 |
=W7 |
W6 |
=L6 |
AC14 |
=W6 |
W5 |
=L5 |
AD14 |
=W5 |
Воспользуемся рядом бит служебной информации 14 строки для определения версии и уровня микрокода, а также для получения вида используемой в данном коде маски. Сначала найдем соответствие в таблице ГОСТ, потом сделаем самопроверку.
Объединяем ячейки P16-AD16 в единую. В полученную новую ячейку P16 добавляем функцию (рис. 14):
=СЦЕП(P14:AD14)
По таблице С.1 ГОСТ (табл. 2) находим битовую последовательность информации о формате и соответствующую последовательность бит данных до маскирования. Для данного примера – 00000.
Таблица 2 – Корректирующие последовательности информации о формате
Последовательность до маскирования |
Последовательность после маскирования |
||
Биты данных |
Биты исправления ошибок |
Двоичная |
Шестнадцатеричная |
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 |
ЗВВА |
Проверим полученный результат. Заполняем ячейки в соответствии с таблицей:
Ячейка |
Функция |
|
Ячейка |
Функция |
Z6 |
=P14 |
|
Z7 |
1 |
AA6 |
=Q14 |
|
AA7 |
0 |
AB6 |
=R14 |
|
AB7 |
0 |
AC6 |
=S14 |
|
AC7 |
0 |
AD6 |
=T14 |
|
AD7 |
1 |
Воспользуемся алгебраической функцией XOR для получения версии и уровня микрокода, и кода маски. Заполняем ячейки восьмой строчки:
Ячейка |
Функция |
Z8 |
=БИТ.ИСКЛИЛИ(Z6;Z7) |
AA8 |
=БИТ.ИСКЛИЛИ(AA6;AA7) |
AB8 |
=БИТ.ИСКЛИЛИ(AB6;AB7) |
AC8 |
=БИТ.ИСКЛИЛИ(AC6;AC7) |
AD8 |
=БИТ.ИСКЛИЛИ(AD6;AD7) |
В результате получаем последовательность 00000, полностью соответствующую полученной по таблице ГОСТ. Расшифруем полученную комбинацию. Разделим на две части: 000 и 00 (3 и 2 бита соответственно). Обратимся к таблице 13 ГОСТ (табл. 2).
Таблица 2 – Номер символа для 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 |
Получаем, что в данном микрокоде используется версия М1, без уровня, т.е. комбинация M1. Запомним, на последующих этапах данная информация пригодится.
Разбираем вторую часть служебной информации, комбинацию маски 00. Обратимся к рисунку 22 ГОСТ. Перенесем маску с соответствующим битовым кодом на Лист, начиная с ячейки AH4 (рис. 15).
Аналогично основной матрице, каждая черная ячейка обозначена как 1, а каждая белая – 0.
Все необходимые данные на основе служебной информации получены, переходим ко 2-му этапу.
Этап 2. Расшифровка данных основной рабочей области
На основе матрицы исходных данных в диапазоне ячеек D4:N14 и матрицы маскирования в диапазоне ячеек AH4:AR14 получаем матрицу немаскированных данных в диапазоне ячеек D18:N28 с использованием функции XOR. Пример готового результата представлен на рисунке 16.
В ячейке M19 добавлена следующая формула:
=БИТ.ИСКЛИЛИ(M5;AQ5)
Далее за нижний правый угол выделенной ячейки (магический квадрат) дублируем данную формулу на всю поверхность рабочей матрицы. В результате получаем немаскированный вариант для диапазона ячеек M19:N28 и E27:K28.
Самый простой вариант для подготовки к следующему этапу, перенести полученную немаскированную матрицу в таблицу символов вручную. Но это не так интересно. Подготовим таблицу маршрута и заготовку для заполнения битовых комбинаций с учетом особенностей цифрового режима.
Перенесем маршрут (рис. 4) на Лист MS Excel, начиная с ячейки AH18, где каждую ячейку подпишем соответствующим числовым значением. Результат представлен на рисунке 17.
Напомню: не обязательно каждую ячейку прописывать вручную. MS Excel умеет строить прогрессии. Например, заполняем ячейки AR28 и AR27 значениями 1 и 3 соответственно. Затем выделяем заполненные ячейки AR28:AR27 и за магический квадратик выделенного диапазона (нижний правый угол ячейки) тянем до ячейки AR19. В результате весь ряд будет заполнен. Остальное рабочее поле можно заполнить аналогичным образом.
Начиная с ячейки T18 в диапазоне ячеек T18:AA27 делаем шаблон-заготовку для последующего наполнения битовой комбинацией в буквенно-цифровом режиме. Пример полученного результата представлен на рисунке 18 (цветовая дифференциация произвольная). Цветом отделена служебная информация и кодовая комбинация декодируемого числа.
Так как этой информации достаточно для расшифровки сообщения, переходим к третьему этапу.
Этап 3. Преобразование кода в набор символов
Пример итогового варианта представлен на рисунке 19.
Как было упомянуто ранее, битовые комбинации в диапазон ячеек T18:AA27 можно перенести вручную (простой вариант). Но можно и автоматизировать. Таблица функций заполнит битовые ячейки автоматически (табл. 3).
Таблица 3 – Функциональные ячейки битовых последовательностей
№ п/п |
Ячейка |
Функция |
Первая строка | ||
1. |
T19 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(T18;$AR$19:$AR$28;0);ПОИСКПОЗ(T18;AI28:AR28;0)) |
2. |
U19 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(U18;$AQ$19:$AQ$28;0);ПОИСКПОЗ(U18;AI28:AR28;0)) |
3. |
V19 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(V18;$AR$19:$AR$28;0);ПОИСКПОЗ(V18;AI27:AR27;0)) |
4. |
W19 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(W18;$AQ$19:$AQ$28;0);ПОИСКПОЗ(W18;AI27:AR27;0)) |
5. |
X19 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(X18;$AR$19:$AR$28;0);ПОИСКПОЗ(X18;AI26:AR26;0)) |
6. |
Y19 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(Y18;$AQ$19:$AQ$28;0);ПОИСКПОЗ(Y18;AI26:AR26;0)) |
7. |
Z19 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(Z18;$AR$19:$AR$28;0);ПОИСКПОЗ(Z18;AI25:AR25;0)) |
8. |
AA19 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(AA18;$AQ$19:$AQ$28;0);ПОИСКПОЗ(AA18;AI25:AR25;0)) |
Вторая строка | ||
9. |
T21 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(T20;$AR$19:$AR$28;0);ПОИСКПОЗ(T20;AI24:AR24;0)) |
10. |
U21 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(U20;$AQ$19:$AQ$28;0);ПОИСКПОЗ(U20;AI24:AR24;0)) |
11. |
V21 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(V20;$AR$19:$AR$28;0);ПОИСКПОЗ(V20;AI23:AR23;0)) |
12. |
W21 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(W20;$AQ$19:$AQ$28;0);ПОИСКПОЗ(W20;AI23:AR23;0)) |
13. |
X21 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(X20;$AR$19:$AR$28;0);ПОИСКПОЗ(X20;AI22:AR22;0)) |
14. |
Y21 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(Y20;$AQ$19:$AQ$28;0);ПОИСКПОЗ(Y20;AI22:AR22;0)) |
15. |
Z21 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(Z20;$AR$19:$AR$28;0);ПОИСКПОЗ(Z20;AI21:AR21;0)) |
16. |
AA21 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(AA20;$AQ$19:$AQ$28;0);ПОИСКПОЗ(AA20;AI21:AR21;0)) |
Третья строка | ||
17. |
T23 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(T22;$AR$19:$AR$28;0);ПОИСКПОЗ(T22;AI20:AR20;0)) |
18. |
U23 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(U22;$AQ$19:$AQ$28;0);ПОИСКПОЗ(U22;AI20:AR20;0)) |
19. |
V23 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(V22;$AR$19:$AR$28;0);ПОИСКПОЗ(V22;AI19:AR19;0)) |
20. |
W23 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(W22;$AQ$19:$AQ$28;0);ПОИСКПОЗ(W22;AI19:AR19;0)) |
21. |
X23 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(X22;$AP$19:$AP$28;0);ПОИСКПОЗ(X22;AI27:AR27;0)) |
22. |
Y23 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(Y22;$AP$19:$AP$28;0);ПОИСКПОЗ(Y22;AI28:AR28;0)) |
23. |
Z23 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(Z22;$AO$19:$AO$28;0);ПОИСКПОЗ(Z22;AI27:AR27;0)) |
24. |
AA23 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(AA22;$AO$19:$AO$28;0);ПОИСКПОЗ(AA22;AI28:AR28;0)) |
Четвертая строка | ||
25. |
T25 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(T24;$AN$19:$AN$28;0);ПОИСКПОЗ(T24;AI27:AR27;0)) |
26. |
U25 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(U24;$AN$19:$AN$28;0);ПОИСКПОЗ(U24;AI28:AR28;0)) |
27. |
V25 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(V24;$AM$19:$AM$28;0);ПОИСКПОЗ(V24;AI27:AR27;0)) |
28. |
W25 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(W24;$AM$19:$AM$28;0);ПОИСКПОЗ(W24;AI28:AR28;0)) |
29. |
X25 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(X24;$AL$19:$AL$28;0);ПОИСКПОЗ(X24;AI27:AR27;0)) |
30. |
Y25 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(Y24;$AL$19:$AL$28;0);ПОИСКПОЗ(Y24;AI28:AR28;0)) |
31. |
Z25 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(Z24;$AK$19:$AK$28;0);ПОИСКПОЗ(Z24;AI27:AR27;0)) |
32. |
AA25 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(AA24;$AK$19:$AK$28;0);ПОИСКПОЗ(AA24;AI28:AR28;0)) |
Пятая строка | ||
33. |
T27 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(T26;$AJ$19:$AJ$28;0);ПОИСКПОЗ(T26;AI27:AR27;0)) |
34. |
U27 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(U26;$AJ$19:$AJ$28;0);ПОИСКПОЗ(U26;AI28:AR28;0)) |
35. |
V27 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(V26;$AI$19:$AI$28;0);ПОИСКПОЗ(V26;AI27:AR27;0)) |
36. |
W27 |
=ИНДЕКС($E$19:$N$28;ПОИСКПОЗ(W26;$AI$19:$AI$28;0);ПОИСКПОЗ(W26;AI28:AR28;0)) |
В ячейках T19:V19 указан код 001 – обозначает наличие цифрового режима (таблица 3 ГОСТ), где биты дают число 1 – одна цифра в микрокоде.
Следующий диапазон из 4-х бит в ячейках W19:Z19 – диапазон, отображающий саму цифру – 0111 или число 7. Проверим, автоматизируем процесс перевода из двоичной системы в десятичную и сделаем проверку с корректирующим кодом на листе Code:
1. Объединим ячейки битовых комбинаций в одну P19:Q19. В полученную ячейку P19 добавим функцию:
=СЦЕП(W19:Z19)
2. В ячейку R19 добавим функцию перевода двоичного кода в десятичное значение:
=ДВ.В.ДЕС(P19)
3. Объединим ячейки в одну P20:R20. В полученную ячейку P20 добавим функцию поиска и вызова соответствующего значения для десятичного числа (в данном случае – 7) на странице Code:
=ИНДЕКС(Code!$C$3:$C$7;ПОИСКПОЗ($R$19;Code!$B$3:$B$7;0))
4. Объединим ячейки в одну P21:R21. В полученную ячейку P21 добавим условие сравнения предыдущих двух комбинаций. Если совпадают – «ОК!», если не совпадают – не «ОК!»:
=ЕСЛИ(P19=P20;"ОК!";"не ОК!")
5. На данном этапе можно остановиться, но остальное поле занимают коды Рида-Соломона и интересно было бы тоже получить для проверки, правильное ли получили число или нет. Автоматизируем процесс получения кодов в ячейках:
№ п/п |
Ячейка |
Функция |
1. |
AB19 |
=СЦЕП(T19:AA19) |
2. |
AC19 |
=ДВ.В.ДЕС(AB19) |
3. |
AB21 |
=СЦЕП(T21:AA21) |
4. |
AC21 |
=ДВ.В.ДЕС(AB21) |
5. |
AB23 |
=СЦЕП(T23:AA23) |
6. |
AC23 |
=ДВ.В.ДЕС(AB23) |
7. |
AB25 |
=СЦЕП(T25:AA25) |
8. |
AC25 |
=ДВ.В.ДЕС(AB25) |
9. |
AB27 |
=СЦЕП(T27:W27) |
10. |
AC27 |
=ДВ.В.ДЕС(AB27) |
В результате получена комбинация из последовательности чисел: 46, 0, 12, 184, 6.
ВАЖНО: здесь пока не разобрался. Стандартный алгоритм, когда есть полная комбинация из 8-битных значений в данном случае не работает. Одна битовая последовательность неполная, всего 4 бита. Как в данном случае делать проверку – непонятно. Пробовал разные комбинации, пока результат не совпадает с вариантом бесплатных библиотек. В ГОСТ указано, что исходных данных должно быть 3 числа, корректирующих – 2.
Этап 4. Применение полученного алгоритма для М1 77
Так как заготовлена битовая последовательность для двух цифр заранее, а основной алгоритм очень схож (необходимо будет поменять только маску и функцию комбинации итогового кода при переводе в десятичный формат), то воспользуемся данным обстоятельством и просто продублируем страницу М1 7 на М1 77 с учетом замены исходного микрокода.
Копируем диапазон ячеек P5:AD16 на странице М1 7, переходим на страницу М1 77. Выбираем ячейку P5, добавляем скопированный фрагмент P5:AD16 получаем новый анализ служебной информации (рис. 20).
Для М1 77 служебная информация полностью дублирует служебную информацию для М1 7. Следовательно, будем использовать аналогичную маску – 00.
Переходим ко второй составляющей – анализ рабочей области микрокода. Результат представлен на рисунке 21.
Необходимо внести всего одно изменение. В ячейке P19 заменить функцию на:
=СЦЕП(W19:AA19;T21:U21)
В результате получаем полное совпадение кодовой составляющей.
Этап 5. Применение полученного алгоритма для М1 777
Аналогично предыдущему этапу, числовая последовательность для трех цифр заготовлена заранее, и основной алгоритм также схож (необходимо будет поменять только маску и функцию комбинации итогового кода при переводе в десятичный формат), то воспользуемся данным обстоятельством и просто продублируем страницу М1 7 на М1 777 с учетом замены исходного микрокода.
Копируем диапазон ячеек P5:AD16 на странице М1 7, переходим на страницу М1 777. Выбираем ячейку P5, добавляем скопированный фрагмент P5:AD16 получаем новый анализ служебной информации (рис. 22).
Для М1 777 служебная информация не дублирует служебную информацию для М1 7, будет применена новая маска – 01.
Переходим ко второй составляющей – анализ рабочей области микрокода. Результат представлен на рисунке 23.
Необходимо внести несколько изменений. Так как ячейка P19 посредник и значение не столько нужно как итоговое, то пожертвуем расстояние и снимем объединение ячеек P19:Q19. В ячейке P19 необходимо заменить функцию на:
=СЦЕП(W19:AA19;T21:X21)
Объединяем ячейки Q19:R19. В новую ячейку Q19 добавляем функцию:
=ДЕС(P19;2)
В результате получаем полное совпадение кодовой составляющей.
Этап 6. Применение полученного алгоритма для М1 7777
Числовая последовательность для четырех цифр заготовлена заранее, основной алгоритм также схож. Продублируем страницу М1 777 на М1 7777 с учетом замены исходного микрокода.
Копируем диапазон ячеек P5:AD16 на странице М1 777, переходим на страницу М1 7777. Выбираем ячейку P5, добавляем скопированный фрагмент P5:AD16 получаем новый анализ служебной информации (рис. 24).
Для М1 7777 служебная информация не дублирует служебную информацию для М1 777, будет применена новая маска – 11.
Переходим ко второй составляющей – анализ рабочей области микрокода. Результат представлен на рисунке 25.
Необходимо внести несколько изменений. В диапазоне ячеек P19:R19 ничего не изменяем.
Сделаем ячейку P20 так же, как посредника. В ячейку P20 добавляем функцию:
=СЦЕП(Y21:AA21;T23)
Объединяем ячейки Q20:R20. В новую ячейку Q20 добавляем функцию:
=ДЕС(P20;2)
Объединяем ячейки P21:R21. В новую ячейку P21 добавляем функцию:
=СЦЕП(Q19:R20)
В диапазоне ячеек P22:R22 изменяем функцию на:
=ИНДЕКС(Code!$C$3:$C$7;ПОИСКПОЗ(ЗНАЧЕН($P$21);Code!$B$3:$B$7;0))
В результате получаем полное совпадение кодовой составляющей.
Этап 7. Применение полученного алгоритма для М1 77777
Числовая последовательность для пяти цифр заготовлена заранее, основной алгоритм также схож. Продублируем страницу М1 7777 на М1 77777 с учетом замены исходного микрокода.
Копируем диапазон ячеек P5:AD16 на странице М1 7777, переходим на страницу М1 77777. Выбираем ячейку P5, добавляем скопированный фрагмент P5:AD16 получаем новый анализ служебной информации (рис. 26).
Для М1 7777 служебная информация не дублирует служебную информацию для М1 777, будет применена новая маска – 01.
Переходим ко второй составляющей – анализ рабочей области микрокода. Результат представлен на рисунке 27.
Необходимо внести только одно изменение. В ячейку P20 добавляем функцию:
=СЦЕП(Y21:AA21;T23:W23)
В результате получаем полное совпадение кодовой составляющей.
Удачи в декодировании числовых последовательностей Micro QR Code версии M1!!!
orekh
#ненормальное программирование