Задание: необходимо прочитать Micro QR Code версии М3, содержащий кодовое слово, состоящее из цифр (на примере – 777777777777777777 (18 цифр) и максимальном кодовом расстоянии (23 цифры) – 77777777777777777777777; почему выбрано именно такое количество цифр будет также расшифровано) на основе алгоритма, приведенного в ГОСТ Р ИСО/МЭК 18004-2015 (п. 7.4.3, пример 2). Аналогично версии М2 данный режим невозможно прочитать стандартными ресурсами мобильных устройств, производимых GAFAM (как оказалось, свободно распространяемые библиотеки страшно глючат, поэтому Ассоциация отказалась и от этого режима).
Примечание: здесь и далее будет использоваться информация ГОСТ Р ИСО/МЭК 18004-2015 или в оригинале ISO/IEC 18004:2015 (далее – ГОСТ).
Этап 0. Подготовка исходных данных
Рассмотрим М3 поближе. Имеем матрицу размерностью 15x15 бинарных символов (рис. 11 ГОСТ), один индикатор и два определителя (горизонтальный и вертикальный) (рис. 1).
Первый наносимый ограничитель символ на матрицу М3 – надлежащие битовые последовательности информации о формате (рис. 2). Чтение битовой последовательности начинается с 14 бита, т.е. последовательность чтения/записи будет 14, 13, 12, 11, 10 и т.д.
Второй не менее важный элемент М3 – маршрут последовательности заполнения битами данных поля матрицы (рис. 3). Данная схема отражена на рисунке 11 ГОСТ.
Примечание: приведенные в ГОСТ маршруты для M3-M и M3-L практически одинаковые. Если присмотреться внимательнее, то оба маршрута дублируют друг друга и не вносят изменения в последовательность чтения/записи. Единственное различие – это учет блока в 4-бита для RS-алгоритма (9 и 11 блоки). Далее приводится вариант маршрутов для M3-M и M3-L, примененные в распространяемом бесплатном модуле Ассоциации (рис. 4). Маршруты идентичны и не совпадают с приведенными в ГОСТ (ноу-хау программистов моделистов).
Если наложить маршрут на матрицу, получаем последовательность из 124 бит кода М3 (рис. 4). Число 124 пригодится позже при добавлении кода по алгоритму Рида-Соломона на поле Галуа.
Примечание: здесь и далее будем использовать один из доступных программных инструментов Ассоциации практически на любом ПК – MS Excel (русскоязычная версия). Как следствие, все команды автоматизации процессов будут на кириллице.
Запускаем программное приложение MS Excel. Готовим последовательность листов Книги для дальнейшей работы:
- Лист1 – называем Code;
- Лист2 – M3 7×18;
- Лист3 – M3 7×23.
Лист1 (Code) – для размещения корректирующих данных и сверки полученных на листах результатов. Остальные листы нужны для декодирования соответствующих последовательностей.
На листах с семерками (Лист2 – Лист3) делаем размерность ячеек одинаковой (например, 23 на 23 пикселя) и по горизонтали, и по вертикали (рис. 5a). Затем закрашиваем поле серым фоновым цветом (рис. 5b).
Примечание: для удобства дальнейшего описания ссылок на ячейки листа перейдем от современного отображения адресов ячеек в виде R1C1 (относительные ссылки) к старому формату в виде A1 (буквенно-числовое отображение). Выбираем в Меню Файл → Параметры. В категории Формулы в группе Работа с формулами снимаем галочку напротив пункта Стиль ссылок R1C1. В результате названия столбиков должны поменяться с чисел на латинские буквы (рис. 6).
Если посчитать количество пикселей (квадратиков) микрокода М3 (рис. 1) по горизонтали и/или по вертикали, то получится матрица (табличка) размерностью 15×15. Создадим новую схему шаблон для микрокода М3 на листах с семерками: Лист2 – Лист3 начиная с ячейки D4 (рис. 6).
Воспользуемся любым кодировщиком микрокодов в Интернет или рисунками далее для переноса битовой маски рабочего поля микрокода на листы книги MS Excel (рис. 7-8).
Каждый микрокод располагается на индивидуальном листе книги. Верхний левый угол каждого микрокода начинается в ячейке D4.
Исходные данные для декодирования готовы. Переходим к заполнению первого листа книги Code.
В системе QR Code существует несколько разновидностей кодирования: числовой, алфавитно-цифровой, байтовый, кандзи, структурированное соединение и FNC1.
Примечание: каждый из методов имеет ряд собственных особенностей. Не получится использовать предложенный ниже алгоритм для байтовых последовательностей или для кандзи.
Используем числовую систему кодирования для выполнения требований задания. Следующее ограничение – необходимо кодировать 18 и 23 цифровых символа. М3 поддерживает два уровня исправления ошибок – L и M. Обращаемся к таблице 7 ГОСТ, получаем, что уровни L и M поддерживают емкость 18 цифровых символов, а 13 цифровых символа поддерживает только уровень 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. Для примеров получаем:
- 77777777777777777777777 → 1100001001, 1100001001, 1100001001, 1100001001, 1100001001, 1100001001 и 1001101 (8 групп);
- 777777777777777777 → 1100001001, 1100001001, 1100001001, 1100001001, 1100001001 и 1100001001 (6 групп);
- 777 → 1100001001;
- 77 → 1001101;
- 7 → 0111.
Открываем лист Code. Пример готового результата представлен на рисунке 9.
Для автоматизации ячеек C3-C7 воспользуемся следующими функциями:
Ячейка |
Значение |
Ячейка |
Функция |
B3 |
7 |
C3 |
=ОСНОВАНИЕ(B3;2;4) |
B4 |
77 |
C4 |
=ОСНОВАНИЕ(B4;2;7) |
B5 |
777 |
C5 |
=ОСНОВАНИЕ(B5;2;10) |
B6 |
777777777777777777 |
C6 |
=C5&C5&C5&C5&C5&C5 |
B7 |
77777777777777777777777 |
C7 |
=C5&C5&C5&C5&C5&C5&C5&C4 |
Лист с корректирующими данными готов.
Переходим к основным микрокодам. Открываем лист книги М3 7×18 с исходным битовым полем (рис. 10a). К сожалению, за долгие годы MS Excel так и не научился работать с цветом ячеек. Добавим в каждую цветную ячейку соответствующее битовое значение: белая ячейка – 0, черная ячейка – 1 (рис. 10b).
Для удобства отделим цветом индикатор служебной информации (рис. 11a) – битовая последовательность информации о формате. Чтение последовательности начинается с 14 бита, т.е. последовательность чтения будет 14, 13, 12, 11, 10 и т.д.
Также отделяем цветом индикатор распознавания микрокода (рис. 11b).
Полученная матрица готова для дальнейшего анализа (рис. 12).
Переходим к первому этапу – работа со служебной информацией.
Этап 1. Служебная информация
Перед тем как начать работать с основной рабочей областью микрокода, необходимо расшифровать служебную информацию. Пример итогового результата приведен на рисунке 13.
Сначала переводим служебную информацию также в бинарное представление, т.е. ряды ячеек E12-L12 и L5-L12 представляем как набор 0 (светлые ячейки) и 1 (темные ячейки) (рис. 13).
Выносим служебную информацию из микрокода, т.е. дублируем полученный ряд в угловом представлении и в представлении – один ряд. Получаем следующие ссылочные ячейки:
Ячейка |
Функция |
Ячейка |
Функция |
T12 |
=E12 |
T14 |
=T12 |
U12 |
=F12 |
U14 |
=U12 |
V12 |
=G12 |
V14 |
=V12 |
W12 |
=H12 |
W14 |
=W12 |
X12 |
=I12 |
X14 |
=X12 |
Y12 |
=J12 |
Y14 |
=Y12 |
Z12 |
=K12 |
Z14 |
=Z12 |
AA12 |
=L12 |
AA14 |
=AA12 |
AA11 |
=L11 |
AB14 |
=AA11 |
AA10 |
=L10 |
AC14 |
=AA10 |
AA9 |
=L9 |
AD14 |
=AA9 |
AA8 |
=L8 |
AE14 |
=AA8 |
AA7 |
=L7 |
AF14 |
=AA7 |
AA6 |
=L6 |
AG14 |
=AA6 |
AA5 |
=L5 |
AH14 |
=AA5 |
Воспользуемся рядом бит служебной информации 14 строки для определения версии и уровня микрокода, а также для получения вида используемой в данном коде маски. Сначала найдем соответствие в таблице ГОСТ, потом сделаем самопроверку.
Объединяем ячейки T16-AH16 в единую. В полученную новую ячейку T16 добавляем функцию (рис. 14):
=СЦЕП(T14:AH14)
По таблице С.1 ГОСТ (табл. 2) находим битовую последовательность информации о формате и соответствующую последовательность бит данных до маскирования. Для данного примера – 10000.
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 |
ЗВВА |
Проверим полученный результат. Заполняем ячейки в соответствии с таблицей:
Ячейка |
Функция |
Ячейка |
Функция |
AC6 |
=T14 |
AC7 |
1 |
AD6 |
=U14 |
AD7 |
0 |
AE6 |
=V14 |
AE7 |
0 |
AF6 |
=W14 |
AF7 |
0 |
AG6 |
=X14 |
AG7 |
1 |
Воспользуемся алгебраической функцией XOR для получения версии и уровня микрокода, и кода маски. Заполняем ячейки восьмой строчки:
Ячейка |
Функция |
AC8 |
=БИТ.ИСКЛИЛИ(AC6;AC7) |
AD8 |
=БИТ.ИСКЛИЛИ(AD6;AD7) |
AE8 |
=БИТ.ИСКЛИЛИ(AE6;AE7) |
AF8 |
=БИТ.ИСКЛИЛИ(AF6;AF7) |
AG8 |
=БИТ.ИСКЛИЛИ(AG6;AG7) |
В результате получаем последовательность 10000, полностью соответствующую полученной по таблице ГОСТ. Расшифруем полученную комбинацию. Разделим на две части: 100 и 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 |
Получаем, что в данном микрокоде используется версия М3 и уровень M, т.е. комбинация M3-M. Запомним, на последующих этапах данная информация пригодится.
Разбираем вторую часть служебной информации, комбинацию маски 00. Обратимся к рисунку 22 ГОСТ. Перенесем маску с соответствующим битовым кодом на Лист, начиная с ячейки AL4 (рис. 14).
Аналогично основной матрице, каждая черная ячейка обозначена как 1, а каждая белая – 0.
Все необходимые данные на основе служебной информации получены, переходим ко 2-му этапу.
Этап 2. Расшифровка данных основной рабочей области
На основе матрицы исходных данных в диапазоне ячеек D4:R18 и матрицы маскирования в диапазоне ячеек AL4:AZ18 получаем матрицу немаскированных данных в диапазоне ячеек D22:R36 с использованием функции XOR. Пример готового результата представлен на рисунке 15.
В ячейке M23 добавлена следующая формула:
=БИТ.ИСКЛИЛИ(M5;AU5)
Далее за нижний правый угол выделенной ячейки (магический квадрат) дублируем данную формулу на всю поверхность рабочей матрицы. В результате получаем немаскированный вариант для диапазона ячеек M23:R36 и E31:L36.
Самый простой вариант для подготовки к следующему этапу, перенести полученную немаскированную матрицу в таблицу символов вручную. Но это не так интересно. Подготовим таблицу маршрута и заготовку для заполнения битовых комбинаций с учетом особенностей числового режима.
Перенесем маршрут (рис. 4) на Лист MS Excel, начиная с ячейки AJ20, где каждую ячейку подпишем соответствующим числовым значением. Результат представлен на рисунке 16.
Напомню: не обязательно каждую ячейку прописывать вручную. MS Excel умеет строить прогрессии. Например, заполняем ячейки AZ36 и AZ35 значениями 1 и 3 соответственно. Затем выделяем заполненные ячейки AZ36:AZ35 и за магический квадратик выделенного диапазона (нижний правый угол ячейки) тянем до ячейки AZ23. В результате весь ряд будет заполнен. Остальное рабочее поле можно заполнить аналогичным образом.
Начиная с ячейки R20 в диапазоне ячеек R20:AD32 делаем шаблон-заготовку для последующего наполнения битовой комбинацией в алфавитно-цифровом режиме. Пример полученного результата представлен на рисунке 17 (цветовая дифференциация произвольная). Цветом отделена служебная информация и кодовая комбинация декодируемого числа.
Так как этой информации достаточно для расшифровки сообщения, переходим к третьему этапу.
Этап 3. Преобразование кода в набор символов
Пример итогового варианта представлен на рисунке 18.
Как было упомянуто ранее, битовые комбинации в диапазон ячеек T23:AC36 можно перенести вручную (простой вариант). Но можно и автоматизировать. Таблица функций заполнит битовые ячейки автоматически (табл. 3).
Hidden text
Таблица 3 – Функциональные ячейки битовых последовательностей
№ п/п |
Ячейка |
Функция |
Первая строка | ||
1. |
T24 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(T23;$AZ$23:$AZ$36;0);ПОИСКПОЗ(T23;AM36:AZ36;0)) |
2. |
U24 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(U23;$AY$23:$AY$36;0);ПОИСКПОЗ(U23;AM36:AZ36;0)) |
3. |
V24 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(V23;$AZ$23:$AZ$36;0);ПОИСКПОЗ(V23;AM35:AZ35;0)) |
4. |
W24 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W23;$AY$23:$AY$36;0);ПОИСКПОЗ(W23;AM35:AZ35;0)) |
5. |
X24 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X23;$AZ$23:$AZ$36;0);ПОИСКПОЗ(X23;AM34:AZ34;0)) |
6. |
Y24 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y23;$AY$23:$AY$36;0);ПОИСКПОЗ(Y23;AM34:AZ34;0)) |
7. |
Z24 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z23;$AZ$23:$AZ$36;0);ПОИСКПОЗ(Z23;AM33:AZ33;0)) |
Вторая строка | ||
8. |
T26 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(T25;$AY$23:$AY$36;0);ПОИСКПОЗ(T25;AM33:AZ33;0)) |
9. |
U26 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(U25;$AZ$23:$AZ$36;0);ПОИСКПОЗ(U25;AM32:AZ32;0)) |
10. |
V26 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(V25;$AY$23:$AY$36;0);ПОИСКПОЗ(V25;AM32:AZ32;0)) |
11. |
W26 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W25;$AZ$23:$AZ$36;0);ПОИСКПОЗ(W25;AM31:AZ31;0)) |
12. |
X26 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X25;$AY$23:$AY$36;0);ПОИСКПОЗ(X25;AM31:AZ31;0)) |
13. |
Y26 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y25;$AZ$23:$AZ$36;0);ПОИСКПОЗ(Y25;AM30:AZ30;0)) |
14. |
Z26 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z25;$AY$23:$AY$36;0);ПОИСКПОЗ(Z25;AM30:AZ30;0)) |
15. |
AA26 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA25;$AZ$23:$AZ$36;0);ПОИСКПОЗ(AA25;AM29:AZ29;0)) |
16. |
AD26 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB25;$AY$23:$AY$36;0);ПОИСКПОЗ(AB25;AM29:AZ29;0)) |
17. |
AC26 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC25;$AZ$23:$AZ$36;0);ПОИСКПОЗ(AC25;AM28:AZ28;0)) |
Третья строка | ||
18. |
T28 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(T27;$AY$23:$AY$36;0);ПОИСКПОЗ(T27;AM28:AZ28;0)) |
19. |
U28 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(U27;$AZ$23:$AZ$36;0);ПОИСКПОЗ(U27;AM27:AZ27;0)) |
20. |
V28 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(V27;$AY$23:$AY$36;0);ПОИСКПОЗ(V27;AM27:AZ27;0)) |
21. |
W28 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W27;$AZ$23:$AZ$36;0);ПОИСКПОЗ(W27;AM26:AZ26;0)) |
22. |
X28 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X27;$AY$23:$AY$36;0);ПОИСКПОЗ(X27;AM26:AZ26;0)) |
23. |
Y28 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y27;$AZ$23:$AZ$36;0);ПОИСКПОЗ(Y27;AM25:AZ25;0)) |
24. |
Z28 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z27;$AY$23:$AY$36;0);ПОИСКПОЗ(Z27;AM25:AZ25;0)) |
25. |
AA28 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA27;$AZ$23:$AZ$36;0);ПОИСКПОЗ(AA27;AM24:AZ24;0)) |
26. |
AD28 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB27;$AY$23:$AY$36;0);ПОИСКПОЗ(AB27;AM24:AZ24;0)) |
27. |
AC28 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC27;$AZ$23:$AZ$36;0);ПОИСКПОЗ(AC27;AM23:AZ23;0)) |
Четвертая строка | ||
28. |
T30 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(T29;$AY$23:$AY$36;0);ПОИСКПОЗ(T29;AM23:AZ23;0)) |
29. |
U30 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(U29;$AX$23:$AX$36;0);ПОИСКПОЗ(U29;AM23:AZ23;0)) |
30. |
V30 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(V29;$AW$23:$AW$36;0);ПОИСКПОЗ(V29;AM23:AZ23;0)) |
31. |
W30 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W29;$AX$23:$AX$36;0);ПОИСКПОЗ(W29;AM24:AZ24;0)) |
32. |
X30 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X29;$AW$23:$AW$36;0);ПОИСКПОЗ(X29;AM24:AZ24;0 |
33. |
Y30 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y29;$AX$23:$AX$36;0);ПОИСКПОЗ(Y29;AM25:AZ25;0)) |
34. |
Z30 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z29;$AW$23:$AW$36;0);ПОИСКПОЗ(Z29;AM25:AZ25;0)) |
35. |
AA30 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA29;$AX$23:$AX$36;0);ПОИСКПОЗ(AA29;AM26:AZ26;0)) |
36. |
AD30 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB29;$AW$23:$AW$36;0);ПОИСКПОЗ(AB29;AM26:AZ26;0)) |
37. |
AC30 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC29;$AX$23:$AX$36;0);ПОИСКПОЗ(AC29;AM27:AZ27;0)) |
Пятая строка | ||
38. |
T32 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(T31;$AW$23:$AW$36;0);ПОИСКПОЗ(T31;AM27:AZ27;0)) |
39. |
U32 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(U31;$AX$23:$AX$36;0);ПОИСКПОЗ(U31;AM28:AZ28;0)) |
40. |
V32 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(V31;$AW$23:$AW$36;0);ПОИСКПОЗ(V31;AM28:AZ28;0)) |
41. |
W32 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W31;$AX$23:$AX$36;0);ПОИСКПОЗ(W31;AM29:AZ29;0)) |
42. |
X32 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X31;$AW$23:$AW$36;0);ПОИСКПОЗ(X31;AM29:AZ29;0)) |
43. |
Y32 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y31;$AX$23:$AX$36;0);ПОИСКПОЗ(Y31;AM30:AZ30;0)) |
44. |
Z32 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z31;$AW$23:$AW$36;0);ПОИСКПОЗ(Z31;AM30:AZ30;0)) |
45. |
AA32 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA31;$AX$23:$AX$36;0);ПОИСКПОЗ(AA31;AM31:AZ31;0)) |
46. |
AD32 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB31;$AW$23:$AW$36;0);ПОИСКПОЗ(AB31;AM31:AZ31;0)) |
47. |
AC32 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC31;$AX$23:$AX$36;0);ПОИСКПОЗ(AC31;AM32:AZ32;0)) |
Шестая строка | ||
48. |
T34 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(T33;$AW$23:$AW$36;0);ПОИСКПОЗ(T33;AM32:AZ32;0)) |
49. |
U34 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(U33;$AX$23:$AX$36;0);ПОИСКПОЗ(U33;AM33:AZ33;0)) |
50. |
V34 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(V33;$AW$23:$AW$36;0);ПОИСКПОЗ(V33;AM33:AZ33;0)) |
51. |
W34 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W33;$AX$23:$AX$36;0);ПОИСКПОЗ(W33;AM34:AZ34;0)) |
52. |
X34 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X33;$AW$23:$AW$36;0);ПОИСКПОЗ(X33;AM34:AZ34;0)) |
53. |
Y34 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y33;$AX$23:$AX$36;0);ПОИСКПОЗ(Y33;AM35:AZ35;0)) |
54. |
Z34 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z33;$AW$23:$AW$36;0);ПОИСКПОЗ(Z33;AM35:AZ35;0)) |
55. |
AA34 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA33;$AX$23:$AX$36;0);ПОИСКПОЗ(AA33;AM36:AZ36;0)) |
56. |
AD34 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB33;$AW$23:$AW$36;0);ПОИСКПОЗ(AB33;AM36:AZ36;0)) |
57. |
AC34 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC33;$AV$23:$AV$36;0);ПОИСКПОЗ(AC33;AM36:AZ36;0)) |
Седьмая строка | ||
58. |
T36 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(T35;$AU$23:$AU$36;0);ПОИСКПОЗ(T35;AM36:AZ36;0)) |
59. |
U36 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(U35;$AV$23:$AV$36;0);ПОИСКПОЗ(U35;AM35:AZ35;0)) |
60. |
V36 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(V35;$AU$23:$AU$36;0);ПОИСКПОЗ(V35;AM35:AZ35;0)) |
61. |
W36 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W35;$AV$23:$AV$36;0);ПОИСКПОЗ(W35;AM34:AZ34;0)) |
62. |
X36 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X35;$AU$23:$AU$36;0);ПОИСКПОЗ(X35;AM34:AZ34;0)) |
63. |
Y36 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y35;$AV$23:$AV$36;0);ПОИСКПОЗ(Y35;AM33:AZ33;0)) |
64. |
Z36 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z35;$AU$23:$AU$36;0);ПОИСКПОЗ(Z35;AM33:AZ33;0)) |
65. |
AA36 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA35;$AV$23:$AV$36;0);ПОИСКПОЗ(AA35;AM32:AZ32;0)) |
66. |
AD36 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB35;$AU$23:$AU$36;0);ПОИСКПОЗ(AB35;AM32:AZ32;0)) |
67. |
AC36 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC35;$AV$23:$AV$36;0);ПОИСКПОЗ(AC35;AM31:AZ31;0)) |
В диапазоне ячеек T24:U24 указан код 00 – обозначает наличие числового режима (таблица 2 ГОСТ).
Следующий диапазон из пяти бит в ячейках V24:Z24 – диапазон, отображающий битовую комбинацию – 10010 или число 18 (по количеству искомых в микрокоде цифр). Проверим, автоматизируем процесс перевода последовательности бит из двоичной системы в десятичную:
1. Объединим ячейки битовых комбинаций в одну AB24:AC24. В полученную ячейку AB24 добавим функцию:
=ДЕС(СЦЕП(V24:Z24);2)
2. Аналогичным образом получим искомые группы цифр 777, 777, 777, 777, 777 и 777. Добавим функции в ячейки, согласно следующие таблице:
Ячейка |
Функция |
Ячейка |
Функция |
AE26-AF26 |
=ДЕС(СЦЕП(T26:AC26);2) |
AE32-AF32 |
=ДЕС(СЦЕП(T32:AC32);2) |
AE28-AF28 |
=ДЕС(СЦЕП(T28:AC28);2) |
AE34-AF34 |
=ДЕС(СЦЕП(T34:AC34);2) |
AE30-AF30 |
=ДЕС(СЦЕП(T30:AC30);2) |
AE36-AF36 |
=ДЕС(СЦЕП(T36:AC36);2) |
3. Объединим ячейки в одну T38:AF38. Добавляем функцию сцепления битовых комбинаций:
=СЦЕП(AE26;AE28;AE30;AE32;AE34;AE36)
4. Объединим ячейки в одну T39:AF39. Переносим аналогичную комбинацию цифр со страницы Code для дальнейшего сравнения:
=Code!B6
5. Объединим ячейки в одну T40:AF40. В полученную ячейку Т40 добавим условие сравнения предыдущих двух комбинаций. Если совпадают – «ОК!», если не совпадают – не «ОК!»:
=ЕСЛИ(T38=T39;"ОК!";"не ОК!")
6. На данном этапе можно остановиться, остальное поле занимает код Рида-Соломона. В более сложном алгоритме «Пишем микрокод» будет расшифрован данный этап детально на примере.
Этап 4. Применение полученного алгоритма для М3 7×23
Так как заготовлена битовая последовательность для десяти цифр заранее, а основной алгоритм очень схож (необходимо будет поменять только маску и функцию комбинации итогового кода при переводе в десятичный формат), то воспользуемся данным обстоятельством и просто продублируем страницу М3 7×18 на М3 7×23 с учетом замены исходного микрокода.
Копируем диапазон ячеек T4:AZ18 на странице М3 7×18, переходим на страницу М3 7×23. Выбираем ячейку T4, добавляем скопированный фрагмент T4:AZ18 получаем новый анализ служебной информации (рис. 19).
Для М3 7×23 служебная информация не дублирует служебную информацию для М3 7×18. Необходимо использовать другую маску – 11.
Переходим ко второй составляющей – анализ рабочей области микрокода. На странице М3 7×18 выделяем диапазон ячеек B20:AZ40 и переносим на страницу М3 7×23. Вносим редакцию (рис. 20).
Необходимо внести несколько изменений. Сначала дополним таблицу 3 набором ячеек:
№ п/п |
Ячейка |
Функция |
Восьмая строка | ||
1. |
T38 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(T37;$AU$23:$AU$36;0);ПОИСКПОЗ(T37;AM31:AZ31;0)) |
2. |
U38 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(U37;$AV$23:$AV$36;0);ПОИСКПОЗ(U37;AM30:AZ30;0)) |
3. |
V38 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(V37;$AU$23:$AU$36;0);ПОИСКПОЗ(V37;AM30:AZ30;0)) |
4. |
W38 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W37;$AV$23:$AV$36;0);ПОИСКПОЗ(W37;AM29:AZ29;0)) |
5. |
X38 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X37;$AU$23:$AU$36;0);ПОИСКПОЗ(X37;AM29:AZ29;0)) |
6. |
Y38 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y37;$AV$23:$AV$36;0);ПОИСКПОЗ(Y37;AM28:AZ28;0)) |
7. |
Z38 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z37;$AU$23:$AU$36;0);ПОИСКПОЗ(Z37;AM28:AZ28;0)) |
8. |
AA38 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA37;$AV$23:$AV$36;0);ПОИСКПОЗ(AA37;AM27:AZ27;0)) |
9. |
AD38 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB37;$AU$23:$AU$36;0);ПОИСКПОЗ(AB37;AM27:AZ27;0)) |
10. |
AC38 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC37;$AV$23:$AV$36;0);ПОИСКПОЗ(AC37;AM26:AZ26;0)) |
Девятая строка | ||
11. |
T40 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(T39;$AU$23:$AU$36;0);ПОИСКПОЗ(T39;AM26:AZ26;0)) |
12. |
U40 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(U39;$AV$23:$AV$36;0);ПОИСКПОЗ(U39;AM25:AZ25;0)) |
13. |
V40 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(V39;$AU$23:$AU$36;0);ПОИСКПОЗ(V39;AM25:AZ25;0)) |
14. |
W40 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W39;$AV$23:$AV$36;0);ПОИСКПОЗ(W39;AM24:AZ24;0)) |
15. |
X40 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X39;$AU$23:$AU$36;0);ПОИСКПОЗ(X39;AM24:AZ24;0)) |
16. |
Y40 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y39;$AV$23:$AV$36;0);ПОИСКПОЗ(Y39;AM23:AZ23;0)) |
17. |
Z40 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z39;$AU$23:$AU$36;0);ПОИСКПОЗ(Z39;AM23:AZ23;0)) |
Аналогично предыдущему этапу, в диапазоне ячеек T24:U24 указан код 00 – обозначает наличие числового режима (таблица 2 ГОСТ). Следующий диапазон из 4-х бит в ячейках V24:Z24 – диапазон, отображающий битовую комбинацию – 10111 или число 23 (по количеству искомых в микрокоде цифр). Проверка в ячейке AB24:AC24 подтверждает полученное значение.
1. Далее получим искомые группы цифр для новых комбинаций 777 и 77. Добавим функции в ячейки, согласно следующие таблице:
Ячейка |
Функция |
AE38-AF38 |
=ДЕС(СЦЕП(T38:AC38);2) |
AE40-AF40 |
=ДЕС(СЦЕП(T40:Z40);2) |
1. Объединенную ячейку T38:AF38 переносим в T42:AF42. Изменяем функцию сцепления битовых комбинаций:
=СЦЕП(AE26;AE28;AE30;AE32;AE34;AE36;AE38;AE40)
2. Объединенную ячейку T39:AF39 переносим в T43:AF43. Переносим аналогичную комбинацию цифр со страницы Code для дальнейшего сравнения:
=Code!B7
3. Объединенную ячейку T40:AF40 переносим в T44:AF44. В полученной ячейке T44 изменим условие сравнения предыдущих двух комбинаций. Если совпадают – «ОК!», если не совпадают – не «ОК!»:
=ЕСЛИ(T42=T43;"ОК!";"не ОК!")
В результате получаем полное совпадение кодовой составляющей.
Удачи в декодировании числовых последовательностей Micro QR Code версии M3!!!