Задание: необходимо прочитать Micro QR Code версии М2, содержащий кодовое слово, состоящее из цифр (на примере – 99999999 и максимальном кодовом расстоянии – 9999999999; почему выбрано именно такое количество цифр будет также расшифровано) на основе алгоритма, приведенного в ГОСТ Р ИСО/МЭК 18004-2015 (п. 7.4.3, пример 2). Аналогично версии М1 данный режим невозможно прочитать стандартными ресурсами мобильных устройств, производимых GAFAM (как оказалось, свободно распространяемые библиотеки страшно глючат, поэтому Ассоциация отказалась и от этого режима).
Примечание: здесь и далее будет использоваться информация ГОСТ Р ИСО/МЭК 18004-2015 или в оригинале ISO/IEC 18004:2015 (далее – ГОСТ).
Этап 0. Подготовка исходных данных
Рассмотрим М2 поближе. Имеем матрицу размерностью 13´13 бинарных символов (рис. 11 ГОСТ), один индикатор и два определителя (горизонтальный и вертикальный) (рис. 1).
![Рисунок 1 – Исходная матрица для М2 Рисунок 1 – Исходная матрица для М2](https://habrastorage.org/getpro/habr/upload_files/62b/6aa/e58/62b6aae5871c921cd510e16ae24de911.png)
Первый наносимый ограничитель символ на матрицу М2 – надлежащие битовые последовательности информации о формате (рис. 2). Чтение битовой последовательности начинается с 14 бита, т.е. последовательность чтения/записи будет 14, 13, 12, 11, 10 и т.д.
![Рисунок 2 – Битовая последовательность информации о формате Рисунок 2 – Битовая последовательность информации о формате](https://habrastorage.org/getpro/habr/upload_files/b3b/c70/9b4/b3bc709b4fe22b8e434350643739bae3.png)
Второй не менее важный элемент М2 – маршрут последовательности заполнения битами данных поля матрицы (рис. 3). Данная схема отражена на рисунке 11 ГОСТ.
![Рисунок 3 – Маршрут последовательности записи бит кода М2 Рисунок 3 – Маршрут последовательности записи бит кода М2](https://habrastorage.org/getpro/habr/upload_files/dcd/35e/0c1/dcd35e0c1d1b7448a4a4077da1990b89.png)
Если наложить маршрут на матрицу, получаем последовательность из 80 бит кода М2 (рис. 4). Число 80 пригодится чуть позже при добавлении кода по алгоритму Рида-Соломона на поле Галуа.
![Рисунок 4 – Кодовая последовательность на матричном поле М2 Рисунок 4 – Кодовая последовательность на матричном поле М2](https://habrastorage.org/getpro/habr/upload_files/521/9f7/498/5219f74988ab3edabbe8384c0a7c112c.png)
Примечание: здесь и далее будем использовать один из доступных программных инструментов Ассоциации практически на любом ПК – MS Excel (русскоязычная версия). Как следствие, все команды автоматизации процессов будут на кириллице.
Запускаем программное приложение MS Excel. Готовим последовательность листов Книги для дальнейшей работы:
- Лист1 – называем Code;
- Лист2 – M2 99999999;
- Лист3 – M2 9999999999.
Лист1 (Code) – для размещения корректирующих данных и сверки полученных на листах результатов. Остальные листы нужны для декодирования соответствующих последовательностей.
На листах с семерками (Лист2 – Лист3) делаем размерность ячеек одинаковой (например, 23 на 23 пикселя) и по горизонтали, и по вертикали (рис. 5a). Затем закрашиваем поле серым фоновым цветом (рис. 5b).
![Рисунок 5a – Заготовка для работы с микрокодами версии М2 (ячейки) Рисунок 5a – Заготовка для работы с микрокодами версии М2 (ячейки)](https://habrastorage.org/getpro/habr/upload_files/05d/3aa/18b/05d3aa18b99b8e332f9aa8d0b06b083a.png)
![Рисунок 5b – Заготовка для работы с микрокодами версии М2 (поле) Рисунок 5b – Заготовка для работы с микрокодами версии М2 (поле)](https://habrastorage.org/getpro/habr/upload_files/3af/ee7/98c/3afee798c46dd32f5a271ce2e29b1651.png)
Примечание: для удобства дальнейшего описания ссылок на ячейки листа перейдем от современного отображения адресов ячеек в виде R1C1 (относительные ссылки) к старому формату в виде A1 (буквенно-числовое отображение). Выбираем в Меню Файл → Параметры. В категории Формулы в группе Работа с формулами снимаем галочку напротив пункта Стиль ссылок R1C1. В результате названия столбиков должны поменяться с чисел на латинские буквы (рис. 6).
Если посчитать количество пикселей (квадратиков) микрокода М2 (рис. 1) по горизонтали и/или по вертикали, то получится матрица (табличка) размерностью 13×13. Создадим новую схему шаблон для микрокода М2 на листах с семерками: Лист2 – Лист3 начиная с ячейки D4 (рис. 6).
![Рисунок 6 – Матрица рабочей поверхности с нанесенными индикаторами М2 Рисунок 6 – Матрица рабочей поверхности с нанесенными индикаторами М2](https://habrastorage.org/getpro/habr/upload_files/8d7/61b/99a/8d761b99a398c2b3785e9d6f13694f4d.png)
Воспользуемся любым кодировщиком микрокодов в Интернет или рисунками далее для переноса битовой маски рабочего поля микрокода на листы книги MS Excel (рис. 7-8).
Каждый микрокод располагается на индивидуальном листе книги. Верхний левый угол каждого микрокода начинается в ячейке D4.
![Рисунок 7 – Исходная матрица битовых данных для М2 99999999 Рисунок 7 – Исходная матрица битовых данных для М2 99999999](https://habrastorage.org/getpro/habr/upload_files/26e/5aa/420/26e5aa420994d00ba9a11904c5713048.png)
![Рисунок 8 – Исходная матрица битовых данных для М2 9999999999 Рисунок 8 – Исходная матрица битовых данных для М2 9999999999](https://habrastorage.org/getpro/habr/upload_files/b16/8bf/56a/b168bf56a9dcc08a52a7a1b80b7c2ad1.png)
Исходные данные для декодирования готовы. Переходим к заполнению первого листа книги Code.
В системе QR Code существует несколько разновидностей кодирования: числовой, алфавитно-цифровой, байтовый, кандзи, структурированное соединение и FNC1.
Примечание: каждый из методов имеет ряд собственных особенностей. Не получится использовать предложенный ниже алгоритм для байтовых последовательностей или для кандзи.
Используем числовую систему кодирования для выполнения требований задания. Следующее ограничение – необходимо кодировать 8 и 10 цифровых символов. М2 поддерживает два уровня исправления ошибок – L и M. Обращаемся к таблице 7 ГОСТ, получаем, что уровни L и M поддерживают емкость 8 цифровых символов, а 10 цифровых символов поддерживает только уровень L (табл. 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. Для примеров получаем:
- 9999999999 → 1111100111, 1111100111, 1111100111 и 1001 (4 группы);
- 99999999 → 1111100111, 1111100111 и 1100011 (3 группы);
- 999 → 1111100111;
- 99 → 1100011;
- 9 → 1001;
Открываем лист Code. Пример готового результата представлен на рисунке 9.
![Рисунок 9 – Лист корректировки исходной информации Рисунок 9 – Лист корректировки исходной информации](https://habrastorage.org/getpro/habr/upload_files/309/dc3/93f/309dc393f0f1056c76a0528d245c0a71.png)
Для автоматизации ячеек C3-C7 воспользуемся следующими функциями:
Ячейка |
Значение |
Ячейка |
Функция |
B3 |
9 |
C3 |
=ОСНОВАНИЕ(B3;2;4) |
B4 |
99 |
C4 |
=ОСНОВАНИЕ(B4;2;7) |
B5 |
999 |
C5 |
=ОСНОВАНИЕ(B5;2;10) |
B6 |
99999999 |
C6 |
=C5&C5&C4 |
B7 |
9999999999 |
C7 |
=C5&C5&C5&C3 |
Лист с корректирующими данными готов.
Переходим к основным микрокодам. Открываем лист книги М2 99999999 с исходным битовым полем (рис. 10a). К сожалению, за долгие годы MS Excel так и не научился работать с цветом ячеек. Добавим в каждую цветную ячейку соответствующее битовое значение: белая ячейка – 0, черная ячейка – 1 (рис. 10b).
![Рисунок 10a – Заполненная матрица битовой составляющей исходных данных Рисунок 10a – Заполненная матрица битовой составляющей исходных данных](https://habrastorage.org/getpro/habr/upload_files/28a/a85/80d/28aa8580d7c9cc13fdaade2130b7a301.png)
![Рисунок 10b – Матрица битовой составляющей исходных данных с обозначениями Рисунок 10b – Матрица битовой составляющей исходных данных с обозначениями](https://habrastorage.org/getpro/habr/upload_files/6b6/0ab/181/6b60ab181decf3fa06f100cd46e036f7.png)
Для удобства отделим цветом индикатор служебной информации (рис. 11a) – битовая последовательность информации о формате. Чтение последовательности начинается с 14 бита, т.е. последовательность чтения будет 14, 13, 12, 11, 10 и т.д.
![Рисунок 11a – Отделена цветом служебная информация Рисунок 11a – Отделена цветом служебная информация](https://habrastorage.org/getpro/habr/upload_files/e67/bbf/841/e67bbf84111802eeeeb19517115de8e9.png)
Также отделяем цветом индикатор распознавания микрокода (рис. 11b).
![Рисунок 11b – Отделены цветом служебная информация и индикаторы Рисунок 11b – Отделены цветом служебная информация и индикаторы](https://habrastorage.org/getpro/habr/upload_files/889/d10/fdd/889d10fdddce3620c54305858959d350.png)
Полученная матрица готова для дальнейшего анализа (рис. 12).
![Рисунок 12 – Итоговый результат отображения матрицы исходных данных версии М2 Рисунок 12 – Итоговый результат отображения матрицы исходных данных версии М2](https://habrastorage.org/getpro/habr/upload_files/c22/c73/9bd/c22c739bd753d7c7da06620388973ccd.png)
Переходим к первому этапу – работа со служебной информацией.
Этап 1. Служебная информация
Перед тем как начать работать с основной рабочей областью микрокода, необходимо расшифровать служебную информацию. Пример итогового результата приведен на рисунке 13.
![Рисунок 13 – Расшифрованная служебная информация Рисунок 13 – Расшифрованная служебная информация](https://habrastorage.org/getpro/habr/upload_files/6b5/169/0ef/6b51690efc47aaae817e74c5ec158089.png)
Сначала переводим служебную информацию также в бинарное представление, т.е. ряды ячеек E12-L12 и L5-L12 представляем как набор 0 (светлые ячейки) и 1 (темные ячейки) (рис. 13).
Выносим служебную информацию из микрокода, т.е. дублируем полученный ряд в угловом представлении и в представлении – один ряд. Получаем следующие ссылочные ячейки:
Ячейка |
Функция |
Ячейка |
Функция |
R12 |
=E12 |
R14 |
=R12 |
S12 |
=F12 |
S14 |
=S12 |
T12 |
=G12 |
T14 |
=T12 |
U12 |
=H12 |
U14 |
=U12 |
V12 |
=I12 |
V14 |
=V12 |
W12 |
=J12 |
W14 |
=W12 |
X12 |
=K12 |
X14 |
=X12 |
Y12 |
=L12 |
Y14 |
=Y12 |
Y11 |
=L11 |
Z14 |
=Y11 |
Y10 |
=L10 |
AA14 |
=Y10 |
Y9 |
=L9 |
AB14 |
=Y9 |
Y8 |
=L8 |
AC14 |
=Y8 |
Y7 |
=L7 |
AD14 |
=Y7 |
Y6 |
=L6 |
AE14 |
=Y6 |
Y5 |
=L5 |
AF14 |
=Y5 |
Воспользуемся рядом бит служебной информации 14 строки для определения версии и уровня микрокода, а также для получения вида используемой в данном коде маски. Сначала найдем соответствие в таблице ГОСТ, потом сделаем самопроверку.
Объединяем ячейки R16-AF16 в единую. В полученную новую ячейку P16 добавляем функцию (рис. 14):
=СЦЕП(R14:AF14)
По таблице С.1 ГОСТ (табл. 2) находим битовую последовательность информации о формате и соответствующую последовательность бит данных до маскирования. Для данного примера – 01000.
Hidden text
Таблица 2 – Корректирующие последовательности информации о формате
Последовательность до маскирования |
Последовательность после маскирования (символы 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 |
ЗВВА |
Проверим полученный результат. Заполняем ячейки в соответствии с таблицей:
Ячейка |
Функция |
Ячейка |
Функция |
AB6 |
=R14 |
AB7 |
1 |
AC6 |
=S14 |
AC7 |
0 |
AD6 |
=T14 |
AD7 |
0 |
AE6 |
=U14 |
AE7 |
0 |
AF6 |
=V14 |
AF7 |
1 |
Воспользуемся алгебраической функцией XOR для получения версии и уровня микрокода, и кода маски. Заполняем ячейки восьмой строчки:
Ячейка |
Функция |
AB8 |
=БИТ.ИСКЛИЛИ(AB6;AB7) |
AC8 |
=БИТ.ИСКЛИЛИ(AC6;AC7) |
AD8 |
=БИТ.ИСКЛИЛИ(AD6;AD7) |
AE8 |
=БИТ.ИСКЛИЛИ(AE6;AE7) |
AF8 |
=БИТ.ИСКЛИЛИ(AF6;AF7) |
В результате получаем последовательность 01000, полностью соответствующую полученной по таблице ГОСТ. Расшифруем полученную комбинацию. Разделим на две части: 010 и 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 |
Получаем, что в данном микрокоде используется версия М2 и уровень M, т.е. комбинация M2-M. Запомним, на последующих этапах данная информация пригодится.
Разбираем вторую часть служебной информации, комбинацию маски 00. Обратимся к рисунку 22 ГОСТ. Перенесем маску с соответствующим битовым кодом на Лист, начиная с ячейки AJ4 (рис. 14).
![Рисунок 14 – Выбранная маска для микрокода Рисунок 14 – Выбранная маска для микрокода](https://habrastorage.org/getpro/habr/upload_files/8ba/bfb/f7f/8babfbf7f688c67b1acb7963dfb6a627.png)
Аналогично основной матрице, каждая черная ячейка обозначена как 1, а каждая белая – 0.
Все необходимые данные на основе служебной информации получены, переходим ко 2-му этапу.
Этап 2. Расшифровка данных основной рабочей области
На основе матрицы исходных данных в диапазоне ячеек D4:P16 и матрицы маскирования в диапазоне ячеек AJ4:AV16 получаем матрицу немаскированных данных в диапазоне ячеек D20:P32 с использованием функции XOR. Пример готового результата представлен на рисунке 15.
![Рисунок 15 – Матрица немаскированных данных М2-M Рисунок 15 – Матрица немаскированных данных М2-M](https://habrastorage.org/getpro/habr/upload_files/850/b7d/636/850b7d636b66ac88f6be4530e964a0b2.png)
В ячейке M21 добавлена следующая формула:
=БИТ.ИСКЛИЛИ(M5;AS5)
Далее за нижний правый угол выделенной ячейки (магический квадрат) дублируем данную формулу на всю поверхность рабочей матрицы. В результате получаем немаскированный вариант для диапазона ячеек M21:P32 и E29:L32.
Самый простой вариант для подготовки к следующему этапу, перенести полученную немаскированную матрицу в таблицу символов вручную. Но это не так интересно. Подготовим таблицу маршрута и заготовку для заполнения битовых комбинаций с учетом особенностей числового режима.
Перенесем маршрут (рис. 4) на Лист MS Excel, начиная с ячейки AJ20, где каждую ячейку подпишем соответствующим числовым значением. Результат представлен на рисунке 16.
![Рисунок 16 – Маршрут обхода рабочего поля для M2-M на рабочем листе Рисунок 16 – Маршрут обхода рабочего поля для M2-M на рабочем листе](https://habrastorage.org/getpro/habr/upload_files/571/e4d/68e/571e4d68ee6d8aa79b99461ee3b87f5a.png)
Начиная с ячейки R20 в диапазоне ячеек R20:AD32 делаем шаблон-заготовку для последующего наполнения битовой комбинацией в алфавитно-цифровом режиме. Пример полученного результата представлен на рисунке 17 (цветовая дифференциация произвольная). Цветом отделена служебная информация и кодовая комбинация декодируемого числа.
![Рисунок 17 – Шаблон-заготовка для битовых комбинаций Рисунок 17 – Шаблон-заготовка для битовых комбинаций](https://habrastorage.org/getpro/habr/upload_files/0dc/c25/1d3/0dcc251d36a3cee0d613aa754ad60e73.png)
Так как этой информации достаточно для расшифровки сообщения, переходим к третьему этапу.
Этап 3. Преобразование кода в набор символов
Пример итогового варианта представлен на рисунке 18.
![Рисунок 18 – Итоговый пример третьего этапа Рисунок 18 – Итоговый пример третьего этапа](https://habrastorage.org/getpro/habr/upload_files/834/754/893/8347548935aba6e1edfc5aa2c44dcd05.png)
Как было упомянуто ранее, битовые комбинации в диапазон ячеек R21:AD32 можно перенести вручную (простой вариант). Но можно и автоматизировать. Таблица функций заполнит битовые ячейки автоматически (табл. 3).
Hidden text
Таблица 3 – Функциональные ячейки битовых последовательностей
№ п/п |
Ячейка |
Функция |
Первая строка | ||
1. |
R21 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(R20;$AV$21:$AV$32;0);ПОИСКПОЗ(R20;AK32:AV32;0)) |
2. |
S21 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(S20;$AU$21:$AU$32;0);ПОИСКПОЗ(S20;AK32:AV32;0)) |
3. |
T21 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(T20;$AV$21:$AV$32;0);ПОИСКПОЗ(T20;AK31:AV31;0)) |
4. |
U21 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(U20;$AU$21:$AU$32;0);ПОИСКПОЗ(U20;AK31:AV31;0)) |
5. |
V21 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(V20;$AV$21:$AV$32;0);ПОИСКПОЗ(V20;AK30:AV30;0)) |
Вторая строка | ||
6. |
R23 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(R22;$AU$21:$AU$32;0);ПОИСКПОЗ(R22;AK30:AV30;0)) |
7. |
S23 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(S22;$AV$21:$AV$32;0);ПОИСКПОЗ(S22;AK29:AV29;0)) |
8. |
T23 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(T22;$AU$21:$AU$32;0);ПОИСКПОЗ(T22;AK29:AV29;0)) |
9. |
U23 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(U22;$AV$21:$AV$32;0);ПОИСКПОЗ(U22;AK28:AV28;0)) |
10. |
V23 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(V22;$AU$21:$AU$32;0);ПОИСКПОЗ(V22;AK28:AV28;0)) |
11. |
W23 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(W22;$AV$21:$AV$32;0);ПОИСКПОЗ(W22;AK27:AV27;0)) |
12. |
X23 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(X22;$AU$21:$AU$32;0);ПОИСКПОЗ(X22;AK27:AV27;0)) |
13. |
Y23 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(Y22;$AV$21:$AV$32;0);ПОИСКПОЗ(Y22;AK26:AV26;0)) |
14. |
Z23 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(Z22;$AU$21:$AU$32;0);ПОИСКПОЗ(Z22;AK26:AV26;0)) |
15. |
AA23 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(AA22;$AV$21:$AV$32;0);ПОИСКПОЗ(AA22;AK25:AV25;0)) |
Третья строка | ||
16. |
R25 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(R24;$AU$21:$AU$32;0);ПОИСКПОЗ(R24;AK25:AV25;0)) |
17. |
S25 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(S24;$AV$21:$AV$32;0);ПОИСКПОЗ(S24;AK24:AV24;0)) |
18. |
T25 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(T24;$AU$21:$AU$32;0);ПОИСКПОЗ(T24;AK24:AV24;0)) |
19. |
U25 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(U24;$AV$21:$AV$32;0);ПОИСКПОЗ(U24;AK23:AV23;0)) |
20. |
V25 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(V24;$AU$21:$AU$32;0);ПОИСКПОЗ(V24;AK23:AV23;0)) |
21. |
W25 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(W24;$AV$21:$AV$32;0);ПОИСКПОЗ(W24;AK22:AV22;0)) |
22. |
X25 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(X24;$AU$21:$AU$32;0);ПОИСКПОЗ(X24;AK22:AV22;0)) |
23. |
Y25 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(Y24;$AV$21:$AV$32;0);ПОИСКПОЗ(Y24;AK21:AV21;0)) |
24. |
Z25 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(Z24;$AU$21:$AU$32;0);ПОИСКПОЗ(Z24;AK21:AV21;0)) |
25. |
AA25 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(AA24;$AT$21:$AT$32;0);ПОИСКПОЗ(AA24;AK21:AV21;0)) |
Четвертая строка | ||
26. |
R27 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(R26;$AS$21:$AS$32;0);ПОИСКПОЗ(R26;AK21:AV21;0)) |
27. |
S27 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(S26;$AT$21:$AT$32;0);ПОИСКПОЗ(S26;AK22:AV22;0)) |
28. |
T27 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(T26;$AS$21:$AS$32;0);ПОИСКПОЗ(T26;AK22:AV22;0)) |
29. |
U27 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(U26;$AT$21:$AT$32;0);ПОИСКПОЗ(U26;AK23:AV23;0)) |
30. |
V27 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(V26;$AS$21:$AS$32;0);ПОИСКПОЗ(V26;AK23:AV23;0)) |
31. |
W27 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(W26;$AT$21:$AT$32;0);ПОИСКПОЗ(W26;AK24:AV24;0)) |
32. |
X27 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(X26;$AS$21:$AS$32;0);ПОИСКПОЗ(X26;AK24:AV24;0)) |
В ячейке R21 указан код 0 – обозначает наличие числового режима (таблица 2 ГОСТ).
Следующий диапазон из 4-х бит в ячейках S21:V21 – диапазон, отображающий битовую комбинацию – 1000 или число 8 (по количеству искомых в микрокоде цифр). Проверим, автоматизируем процесс перевода последовательности бит из двоичной системы в десятичную:
1. Объединим ячейки битовых комбинаций в одну X21:Y21. В полученную ячейку X21 добавим функцию:
=СЦЕП(S21:V21)
2. В ячейку Z21 добавим функцию перевода двоичного кода в десятичное значение:
=ДВ.В.ДЕС(X21)
3. Аналогичным образом получим искомые группы цифр 999, 999 и 99. Добавим функции в ячейки, согласно следующие таблице:
Ячейка |
Функция |
Ячейка |
Функция |
AB23 |
=СЦЕП(R23:AA23) |
AC23-AD23 |
=ДЕС(AB23;2) |
AB25 |
=СЦЕП(R25:AA25) |
AC25-AD25 |
=ДЕС(AB25;2) |
AB27 |
=СЦЕП(R27:X27) |
AC27-AD27 |
=ДЕС(AB27;2) |
4. Объединим ячейки в одну R29:AD29. Добавляем функцию сцепления битовых комбинаций:
=СЦЕП(AB23;AB25;AB27)
5. Объединим ячейки в одну R30:AD30. Добавляем функцию сцепления числовых комбинаций:
=ЗНАЧЕН(СЦЕП(AC23;AC25;AC27))
6. Объединим ячейки в одну R31:AD31. Переносим аналогичную комбинацию цифр со страницы Code для дальнейшего сравнения:
=Code!B6
7. Объединим ячейки в одну R32:AD32. В полученную ячейку R32 добавим условие сравнения предыдущих двух комбинаций. Если совпадают – «ОК!», если не совпадают – не «ОК!»:
=ЕСЛИ(R30=R31;"ОК!";"не ОК!")
8. На данном этапе можно остановиться, остальное поле занимает код Рида-Соломона. В более сложном алгоритме «Пишем микрокод» будет расшифрован данный этап детально на примере.
Этап 4. Применение полученного алгоритма для М2 9999999999
Так как заготовлена битовая последовательность для десяти цифр заранее, а основной алгоритм очень схож (необходимо будет поменять только маску и функцию комбинации итогового кода при переводе в десятичный формат), то воспользуемся данным обстоятельством и просто продублируем страницу М2 99999999 на М2 9999999999 с учетом замены исходного микрокода.
Копируем диапазон ячеек R4:AV16 на странице М2 99999999, переходим на страницу М2 9999999999. Выбираем ячейку R4, добавляем скопированный фрагмент R4:AV16 получаем новый анализ служебной информации (рис. 19).
Для М2 9999999999 служебная информация не дублирует служебную информацию для М2 99999999. Необходимо использовать другую маску – 11.
![Рисунок 19 – Служебная информация для М2 999999999 Рисунок 19 – Служебная информация для М2 999999999](https://habrastorage.org/getpro/habr/upload_files/7f8/187/c3c/7f8187c3c807cdaa887b6ec47b3f053b.png)
Переходим ко второй составляющей – анализ рабочей области микрокода. Результат представлен на рисунке 20.
![Рисунок 20 – Пример готового результата для М2 9999999999 Рисунок 20 – Пример готового результата для М2 9999999999](https://habrastorage.org/getpro/habr/upload_files/b1a/e23/639/b1ae236392d275b7c6a7f5c7b5a09e1b.png)
Необходимо внести несколько изменений. Сначала дополним таблицу 3 набором ячеек:
№ п/п |
Ячейка |
Функция |
1. |
Y27 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(Y26;$AT$21:$AT$32;0);ПОИСКПОЗ(Y26;AK25:AV25;0)) |
2. |
Z27 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(Z26;$AS$21:$AS$32;0);ПОИСКПОЗ(Z26;AK25:AV25;0)) |
3. |
AA27 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(AA26;$AT$21:$AT$32;0);ПОИСКПОЗ(AA26;AK26:AV26;0)) |
Пятая строка | ||
4. |
R29 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(R28;$AS$21:$AS$32;0);ПОИСКПОЗ(R28;AK26:AV26;0)) |
5. |
S29 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(S28;$AT$21:$AT$32;0);ПОИСКПОЗ(S28;AK27:AV27;0)) |
6. |
T29 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(T28;$AS$21:$AS$32;0);ПОИСКПОЗ(T28;AK27:AV27;0)) |
7. |
U29 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(U28;$AT$21:$AT$32;0);ПОИСКПОЗ(U28;AK28:AV28;0)) |
8. |
V29 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(V28;$AS$21:$AS$32;0);ПОИСКПОЗ(V28;AK28:AV28;0)) |
9. |
W29 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(W28;$AT$21:$AT$32;0);ПОИСКПОЗ(W28;AK29:AV29;0)) |
10. |
X29 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(X28;$AS$21:$AS$32;0);ПОИСКПОЗ(X28;AK29:AV29;0)) |
11. |
Y29 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(Y28;$AT$21:$AT$32;0);ПОИСКПОЗ(Y28;AK30:AV30;0)) |
12. |
Z29 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(Z28;$AS$21:$AS$32;0);ПОИСКПОЗ(Z28;AK30:AV30;0)) |
13. |
AA29 |
=ИНДЕКС($E$21:$P$32;ПОИСКПОЗ(AA28;$AT$21:$AT$32;0);ПОИСКПОЗ(AA28;AK31:AV31;0)) |
Аналогично предыдущему этапу, в ячейке R21 указан код 0 – обозначает наличие числового режима (таблица 2 ГОСТ). Следующий диапазон из 4-х бит в ячейках S21:V21 – диапазон, отображающий битовую комбинацию – 1010 или число 10 (по количеству искомых в микрокоде цифр). Проверка в ячейке Z21 подтверждает полученное значение.
1. Далее получим искомые группы цифр 999, 999, 999 и 9. Добавим функции в ячейки, согласно следующие таблице:
Ячейка |
Функция |
Ячейка |
Функция |
AB23 |
=СЦЕП(R23:AA23) |
AC23-AD23 |
=ДЕС(AB23;2) |
AB25 |
=СЦЕП(R25:AA25) |
AC25-AD25 |
=ДЕС(AB25;2) |
AB27 |
=СЦЕП(R27:X27) |
AC27-AD27 |
=ДЕС(AB27;2) |
AB29 |
=СЦЕП(R29:X29) |
AC29-AD29 |
=ДЕС(AB29;2) |
2. Объединим ячейки в одну R31:AD31. Добавляем функцию сцепления битовых комбинаций:
=СЦЕП(AB23;AB25;AB27;AB29)
3. Объединим ячейки в одну R32:AD32. Добавляем функцию сцепления числовых комбинаций:
=ЗНАЧЕН(СЦЕП(AC23;AC25;AC27;AC29))
4. Объединим ячейки в одну R33:AD33. Переносим аналогичную комбинацию цифр со страницы Code для дальнейшего сравнения:
=Code!B7
5. Объединим ячейки в одну R33:AD33. В полученную ячейку R33 добавим условие сравнения предыдущих двух комбинаций. Если совпадают – «ОК!», если не совпадают – не «ОК!»:
=ЕСЛИ(R32=R33;"ОК!";"не ОК!")
В результате получаем полное совпадение кодовой составляющей.
Удачи в декодировании числовых последовательностей Micro QR Code версии M2!!!