Задание: необходимо прочитать Micro QR Code версии М3, содержащий кодовое слово, на примере закодированных слов – Hello, Knowledge и KaDaBrAOK, на основе алгоритма, приведенного в ГОСТ Р ИСО/МЭК 18004-2015 (п. 7.4.5). Аналогично версии М2 данный режим невозможно прочитать стандартными ресурсами мобильных устройств, производимых GAFAM (как оказалось, свободно распространяемые библиотеки страшно глючат, поэтому Ассоциация отказалась и от этого режима).
Примечание: здесь и далее будет использоваться информация ГОСТ Р ИСО/МЭК 18004-2015 или в оригинале ISO/IEC 18004:2015 (далее – ГОСТ).
Этап 0. Подготовка исходных данных
Рассмотрим М3 поближе. Имеем матрицу размерностью 15´15 бинарных символов (рис. 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 Hello;
— Лист3 – M3 Knowledge;
— Лист4 – M3 KaDaBrAOK.
Лист1 (Code) – для размещения корректирующих данных и сверки полученных на листах результатов. Листы 2, 3 и 4 нужны для декодирования соответствующих последовательностей.
На полях листов Лист2 – Лист4 делаем размерность ячеек одинаковой (например, 23 на 23 пикселя) и по горизонтали, и по вертикали (рис. 5a). Затем закрашиваем поле серым фоновым цветом (рис. 5b).
Примечание: для удобства дальнейшего описания ссылок на ячейки листа перейдем от современного отображения адресов ячеек в виде R1C1 (относительные ссылки) к старому формату в виде A1 (буквенно-числовое отображение). Выбираем в Меню Файл → Параметры. В категории Формулы в группе Работа с формулами снимаем галочку напротив пункта Стиль ссылок R1C1. В результате названия столбиков должны поменяться с чисел на латинские буквы (рис. 6).
Если посчитать количество пикселей (квадратиков) микрокода М3 (рис. 1) по горизонтали и/или по вертикали, то получится матрица (табличка) размерностью 15×15. Создадим новую схему шаблон для микрокода М3 на Лист2 – Лист4 начиная с ячейки D4 (рис. 6).
Воспользуемся любым кодировщиком микрокодов в Интернет или рисунками далее для переноса битовой маски рабочего поля микрокода на листы книги MS Excel (рис. 7-8).
Исходные данные для декодирования готовы. Переходим к заполнению первого листа книги Code.
В системе QR Code существует несколько разновидностей кодирования: числовой, алфавитно—цифровой, байтовый, кандзи, структурированное соединение и FNC1.
Примечание: каждый из методов имеет ряд собственных особенностей. Не получится использовать предложенный ниже алгоритм для байтовых последовательностей или для кандзи.
Используем байтовую систему кодирования для выполнения требований задания. Добавлено следующее ограничение – необходимо кодировать 5 и 9 символов алфавита UTF-8 (Таблица 6 ГОСТ). М3 поддерживает два уровня исправления ошибок – L и M. Обращаемся к таблице 7 ГОСТ, получаем, что уровни L и M поддерживают емкость 5 символов, а 9 символов поддерживает только уровень L (табл. 1).
Воспользуемся алгоритмом, представленном в ГОСТ (п. 7.4.5). Представим символы в виде битовых последовательностей. Получаем следующие комбинации:
— Hello – 01001000 01100101 01101100 01101100 01101111;
— Knowledge – 01001011 01101110 01101111 01110111 01101100 01100101 01100100 01100111 01100101;
— KaDaBrAOK – 01001011 01100001 01000100 01100001 01000010 01110010 01000001 01001111 01001011.
Таблица 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 |
|
Открываем лист Code. Пример готового результата представлен на рисунке 9.
Для автоматизации сначала переносим таблицу символов (табл. 2), начиная с ячейки B2. В диапазоне ячеек B2:B53 алфавит латинских букв A…Z, затем a…z. В диапазоне ячеек D2:D53 соответствующие десятичный значения по таблице UTF-8.
Таблица 2 – Кодирование/декодирование для байтового режима (Таблица 6 ГОСТ, выборка)
|
Знак |
Значение |
Знак |
Значение |
Знак |
Значение |
Знак |
Значение |
Знак |
Значение |
Знак |
Значение |
Знак |
Значение |
Знак |
Значение |
Знак |
Значение |
|
А |
65 |
G |
71 |
М |
77 |
S |
83 |
Y |
89 |
e |
101 |
k |
107 |
q |
113 |
w |
119 |
|
В |
66 |
Н |
72 |
N |
78 |
Т |
84 |
Z |
90 |
f |
102 |
l |
108 |
r |
114 |
x |
120 |
|
С |
67 |
I |
73 |
О |
79 |
U |
85 |
a |
97 |
g |
103 |
m |
109 |
s |
115 |
y |
121 |
|
D |
68 |
J |
74 |
Р |
80 |
V |
86 |
b |
98 |
h |
104 |
n |
110 |
t |
116 |
z |
122 |
|
Е |
69 |
К |
75 |
Q |
81 |
W |
87 |
c |
99 |
i |
105 |
o |
111 |
u |
117 |
|
|
|
F |
70 |
L |
76 |
R |
82 |
X |
88 |
d |
100 |
j |
106 |
p |
112 |
v |
118 |
|
|
Заполняем диапазон ячеек C2:C53. В ячейку C2 добавляем функцию перевода из десятичного числа в двоичное из восьми разрядов:
=ДЕС.В.ДВ(D2;8)
Размножаем за нижний правый угол ячейки C2 (магический квадрат) функцию до ячейки C53. Полученный результат должен соответствовать значениям диапазона на рисунке 9.
Переходим к этапу поиска двоичного значения каждой искомой буквы кодированных слов из заполненного диапазона C2:C53. Проблему многих встроенных функций в MS Excel – отсутствие учета регистра символов решаем с помощью комбинации функций СОВПАД и ПРОСМОТР.
Заполняем диапазоны ячеек символами кодируемых слов следующим образом:
|
Диапазон |
Кодируемое слово (символы) |
|
F3:F7 |
H, e, l, l, o |
|
F9:F17 |
K, n, o, w, l, e, d, g, e |
|
F19:F27 |
K, a, D, a, B, r, A, O, K |
Заполняем диапазон ячеек G3:G27 составной функцией. Например, в ячейке G3 (рис. 10):
=ПРОСМОТР(2;1/СОВПАД($B$2:$B$53;F3);$C$2:$C$53)
Остальные ячейки диапазона G3:G27 заполняются дублированием функции ячейки G3 со смещение по искомому символу. Результат представлен на рисунке 9.
Лист с корректирующими данными готов. Переходим к основным микрокодам. Открываем лист книги М3 Hello с исходным битовым полем (рис. 11a). К сожалению, за долгие годы MS Excel так и не научился работать с цветом ячеек. Добавим в каждую цветную ячейку соответствующее битовое значение: белая ячейка – 0, черная ячейка – 1 (рис. 11b).
Для удобства отделим цветом индикатор служебной информации (рис. 12a) – битовая последовательность информации о формате. Чтение последовательности начинается с 14 бита, т.е. последовательность чтения будет 14, 13, 12, 11, 10 и т.д.
Также отделяем цветом индикатор распознавания микрокода (рис. 12b).
Полученная матрица готова для дальнейшего анализа (рис. 13).
Переходим к первому этапу – работа со служебной информацией.
Этап 1. Служебная информация
Перед тем как начать работать с основной рабочей областью микрокода, необходимо расшифровать служебную информацию. Пример итогового результата приведен на рисунке 14.
Сначала переводим служебную информацию также в бинарное представление, т.е. ряды ячеек E12-L12 и L5-L12 представляем как набор 0 (светлые ячейки) и 1 (темные ячейки) (рис. 14).
Выносим служебную информацию из микрокода, т.е. дублируем полученный ряд в угловом представлении и в представлении – один ряд. Получаем следующие ссылочные ячейки:
|
Ячейка |
Функция |
Ячейка |
Функция |
|
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 ГОСТ (табл. 3) находим битовую последовательность информации о формате и соответствующую последовательность бит данных до маскирования. Для данного примера – 10010.
Hidden text
Таблица 3 – Корректирующие последовательности информации о формате
|
Последовательность до маскирования |
Последовательность после маскирования (символы 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 |
ЗВВА |
Проверим полученный результат. Заполняем ячейки в соответствии с таблицей:
|
Ячейка |
Функция |
Ячейка |
Функция |
|
AD6 |
=T14 |
AD7 |
1 |
|
AE6 |
=U14 |
AE7 |
0 |
|
AF6 |
=V14 |
AF7 |
0 |
|
AG6 |
=W14 |
AG7 |
0 |
|
AH6 |
=X14 |
AH7 |
1 |
Воспользуемся алгебраической функцией XOR для получения версии и уровня микрокода, и кода маски. Заполняем ячейки восьмой строчки:
|
Ячейка |
Функция |
|
AD8 |
=БИТ.ИСКЛИЛИ(AD6;AD7) |
|
AE8 |
=БИТ.ИСКЛИЛИ(AE6;AE7) |
|
AF8 |
=БИТ.ИСКЛИЛИ(AF6;AF7) |
|
AG8 |
=БИТ.ИСКЛИЛИ(AG6;AG7) |
|
AH8 |
=БИТ.ИСКЛИЛИ(AH6;AH7) |
В результате получаем последовательность 10010, полностью соответствующую полученной по таблице ГОСТ. Расшифруем полученную комбинацию. Разделим на две части: 100 и 10 (3 и 2 бита соответственно). Обратимся к таблице 13 ГОСТ (табл. 4).
Таблица 4 – Номер символа для 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. Запомним, на последующих этапах данная информация пригодится.
Разбираем вторую часть служебной информации, комбинацию маски 10. Обратимся к рисунку 22 ГОСТ. Перенесем маску с соответствующим битовым кодом на Лист, начиная с ячейки AL4 (рис. 15).
Аналогично основной матрице, каждая черная ячейка обозначена как 1, а каждая белая – 0.
Все необходимые данные на основе служебной информации получены, переходим ко 2-му этапу.
Этап 2. Расшифровка данных основной рабочей области
На основе матрицы исходных данных в диапазоне ячеек D4:R18 и матрицы маскирования в диапазоне ячеек AL4:AZ18 получаем матрицу немаскированных данных в диапазоне ячеек D22:R36 с использованием функции XOR. Пример готового результата представлен на рисунке 16.
В ячейке M23 добавлена следующая формула:
=БИТ.ИСКЛИЛИ(M5;AU5)
Далее за нижний правый угол выделенной ячейки (магический квадрат) дублируем данную формулу на всю поверхность рабочей матрицы. В результате получаем немаскированный вариант для диапазона ячеек M23:R36 и E31:K36.
Самый простой вариант для подготовки к следующему этапу, перенести полученную немаскированную матрицу в таблицу символов вручную. Но это не так интересно. Подготовим таблицу маршрута и заготовку для заполнения битовых комбинаций с учетом особенностей байтового режима.
Перенесем маршрут (рис. 4) на Лист MS Excel, начиная с ячейки AL22, где каждую ячейку подпишем соответствующим числовым значением. Результат представлен на рисунке 17.
Напомню: не обязательно каждую ячейку прописывать вручную. MS Excel умеет строить прогрессии. Например, заполняем ячейки AZ36 и AZ35 значениями 1 и 3 соответственно. Затем выделяем заполненные ячейки AZ36:AZ35 и за магический квадратик выделенного диапазона (нижний правый угол ячейки) тянем до ячейки AZ23. В результате весь ряд будет заполнен. Остальное рабочее поле можно заполнить аналогичным образом.
Начиная с ячейки U22 в диапазоне ячеек U22:AH35 делаем шаблон-заготовку для последующего наполнения битовой комбинацией в байтовом режиме. Пример полученного результата представлен на рисунке 18 (цветовая дифференциация произвольная). Цветом отделена служебная информация и кодовая комбинация декодируемого числа.
Так как этой информации достаточно для расшифровки сообщения, переходим к третьему этапу.
Этап 3. Преобразование кода в набор символов
Пример итогового варианта представлен на рисунке 19.
Как было упомянуто ранее, битовые комбинации в диапазон ячеек U22:AH35 можно перенести вручную (простой вариант). Но можно и автоматизировать. Таблица функций заполнит битовые ячейки автоматически (табл. 5).
Hidden text
Таблица 5 – Функциональные ячейки битовых последовательностей
|
№ п/п |
Ячейка |
Функция |
|
Первая строка |
||
|
1. |
W23 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W22;$AZ$23:$AZ$36;0);ПОИСКПОЗ(W22;AM36:AZ36;0)) |
|
2. |
X23 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X22;$AY$23:$AY$36;0);ПОИСКПОЗ(X22;AM36:AZ36;0)) |
|
3. |
Y23 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y22;$AZ$23:$AZ$36;0);ПОИСКПОЗ(Y22;AM35:AZ35;0)) |
|
4. |
Z23 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z22;$AY$23:$AY$36;0);ПОИСКПОЗ(Z22;AM35:AZ35;0)) |
|
5. |
AA23 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA22;$AZ$23:$AZ$36;0);ПОИСКПОЗ(AA22;AM34:AZ34;0)) |
|
6. |
AB23 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB22;$AY$23:$AY$36;0);ПОИСКПОЗ(AB22;AM34:AZ34;0)) |
|
Вторая строка |
||
|
7. |
W25 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W24;$AZ$23:$AZ$36;0);ПОИСКПОЗ(W24;AM33:AZ33;0)) |
|
8. |
X25 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X24;$AY$23:$AY$36;0);ПОИСКПОЗ(X24;AM33:AZ33;0)) |
|
9. |
Y25 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y24;$AZ$23:$AZ$36;0);ПОИСКПОЗ(Y24;AM32:AZ32;0)) |
|
10. |
Z25 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z24;$AY$23:$AY$36;0);ПОИСКПОЗ(Z24;AM32:AZ32;0)) |
|
11. |
AA25 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA24;$AZ$23:$AZ$36;0);ПОИСКПОЗ(AA24;AM31:AZ31;0)) |
|
12. |
AB25 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB24;$AY$23:$AY$36;0);ПОИСКПОЗ(AB24;AM31:AZ31;0)) |
|
13. |
AC25 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC24;$AZ$23:$AZ$36;0);ПОИСКПОЗ(AC24;AM30:AZ30;0)) |
|
14. |
AD25 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AD24;$AY$23:$AY$36;0);ПОИСКПОЗ(AD24;AM30:AZ30;0)) |
|
Третья строка |
||
|
15. |
W27 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W26;$AZ$23:$AZ$36;0);ПОИСКПОЗ(W26;AM29:AZ29;0)) |
|
16. |
X27 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X26;$AY$23:$AY$36;0);ПОИСКПОЗ(X26;AM29:AZ29;0)) |
|
17. |
Y27 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y26;$AZ$23:$AZ$36;0);ПОИСКПОЗ(Y26;AM28:AZ28;0)) |
|
18. |
Z27 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z26;$AY$23:$AY$36;0);ПОИСКПОЗ(Z26;AM28:AZ28;0)) |
|
19. |
AA27 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA26;$AZ$23:$AZ$36;0);ПОИСКПОЗ(AA26;AM27:AZ27;0)) |
|
20. |
AB27 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB26;$AY$23:$AY$36;0);ПОИСКПОЗ(AB26;AM27:AZ27;0)) |
|
21. |
AC27 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC26;$AZ$23:$AZ$36;0);ПОИСКПОЗ(AC26;AM26:AZ26;0)) |
|
22. |
AD27 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AD26;$AY$23:$AY$36;0);ПОИСКПОЗ(AD26;AM26:AZ26;0)) |
|
Четвертая строка |
||
|
23. |
W29 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W28;$AZ$23:$AZ$36;0);ПОИСКПОЗ(W28;AM25:AZ25;0)) |
|
24. |
X29 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X28;$AY$23:$AY$36;0);ПОИСКПОЗ(X28;AM25:AZ25;0)) |
|
25. |
Y29 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y28;$AZ$23:$AZ$36;0);ПОИСКПОЗ(Y28;AM24:AZ24;0)) |
|
26. |
Z29 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z28;$AY$23:$AY$36;0);ПОИСКПОЗ(Z28;AM24:AZ24;0)) |
|
27. |
AA29 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA28;$AZ$23:$AZ$36;0);ПОИСКПОЗ(AA28;AM23:AZ23;0)) |
|
28. |
AB29 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB28;$AY$23:$AY$36;0);ПОИСКПОЗ(AB28;AM23:AZ23;0)) |
|
29. |
AC29 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC28;$AX$23:$AX$36;0);ПОИСКПОЗ(AC28;AM23:AZ23;0)) |
|
30. |
AD29 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AD28;$AW$23:$AW$36;0);ПОИСКПОЗ(AD28;AM23:AZ23;0)) |
|
Пятая строка |
||
|
31. |
W31 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W30;$AX$23:$AX$36;0);ПОИСКПОЗ(W30;AM24:AZ24;0)) |
|
32. |
X31 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X30;$AW$23:$AW$36;0);ПОИСКПОЗ(X30;AM24:AZ24;0)) |
|
33. |
Y31 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y30;$AX$23:$AX$36;0);ПОИСКПОЗ(Y30;AM25:AZ25;0)) |
|
34. |
Z31 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z30;$AW$23:$AW$36;0);ПОИСКПОЗ(Z30;AM25:AZ25;0)) |
|
35. |
AA31 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA30;$AX$23:$AX$36;0);ПОИСКПОЗ(AA30;AM26:AZ26;0)) |
|
36. |
AB31 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB30;$AW$23:$AW$36;0);ПОИСКПОЗ(AB30;AM26:AZ26;0)) |
|
37. |
AC31 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC30;$AX$23:$AX$36;0);ПОИСКПОЗ(AC30;AM27:AZ27;0)) |
|
38. |
AD31 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AD30;$AW$23:$AW$36;0);ПОИСКПОЗ(AD30;AM27:AZ27;0)) |
|
Шестая строка |
||
|
39. |
W33 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W32;$AX$23:$AX$36;0);ПОИСКПОЗ(W32;AM28:AZ28;0)) |
|
40. |
X33 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X32;$AW$23:$AW$36;0);ПОИСКПОЗ(X32;AM28:AZ28;0)) |
|
41. |
Y33 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y32;$AX$23:$AX$36;0);ПОИСКПОЗ(Y32;AM29:AZ29;0)) |
|
42. |
Z33 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z32;$AW$23:$AW$36;0);ПОИСКПОЗ(Z32;AM29:AZ29;0)) |
|
43. |
AA33 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA32;$AX$23:$AX$36;0);ПОИСКПОЗ(AA32;AM30:AZ30;0)) |
|
44. |
AB33 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB32;$AW$23:$AW$36;0);ПОИСКПОЗ(AB32;AM30:AZ30;0)) |
|
45. |
AC33 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC32;$AX$23:$AX$36;0);ПОИСКПОЗ(AC32;AM31:AZ31;0)) |
|
46. |
AD33 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AD32;$AW$23:$AW$36;0);ПОИСКПОЗ(AD32;AM31:AZ31;0)) |
В диапазоне ячеек W23:X23 указан код 10 – обозначает наличие байтового режима (таблица 2 ГОСТ). Следующий диапазон из 4-х бит в ячейках Y23:AB23 – диапазон, отображающий битовую комбинацию – 0101 или число 5 (по количеству искомых в микрокоде символов). Проверим, автоматизируем процесс перевода последовательности бит из двоичной системы в десятичную:
1. В ячейку AD23 добавим функцию:
=ДЕС(СЦЕП(Y23:AB23);2)
2. Аналогичным образом получим искомые группы пар символов. Добавим функции в ячейки, согласно следующие таблице:
|
Ячейка |
Функция |
|
AF25-AH25 |
=СЦЕП(W25:AD25) |
|
AF27-AH27 |
=СЦЕП(W27:AD27) |
|
AF29-AH29 |
=СЦЕП(W29:AD29) |
|
AF31-AH31 |
=СЦЕП(W31:AD31) |
|
AF33-AH33 |
=СЦЕП(W33:AD33) |
3. Сравниваем полученные числовые значения со значениями на странице Code:
|
Ячейка |
Функция |
|
U25 |
=ЕСЛИ(AF25=Code!G3;Code!F3;»-«) |
|
U27 |
=ЕСЛИ(AF27=Code!G4;Code!F4;»-«) |
|
U29 |
=ЕСЛИ(AF29=Code!G5;Code!F5;»-«) |
|
U31 |
=ЕСЛИ(AF31=Code!G6;Code!F6;»-«) |
|
U33 |
=ЕСЛИ(AF33=Code!G7;Code!F7;»-«) |
4. Объединим ячейки в одну U35:AG35. В полученную ячейку U35 добавим объединенный посимвольный результат:
=СЦЕП(U25;U27;U29;U31;U33)
5. На данном этапе можно остановиться, остальное поле занимает код Рида-Соломона. В более сложном алгоритме «Пишем микрокод» будет расшифрован данный этап детально на примере.
Этап 4. Применение полученного алгоритма для M3 Knowledge
Так как заготовлена битовая последовательность для M3 Knowledge заранее, а основной алгоритм очень схож (необходимо будет поменять только маску и функцию комбинации итогового кода), то воспользуемся данным обстоятельством и просто продублируем страницу М3 Hello на M3 Knowledge с учетом замены исходного микрокода.
Копируем диапазон ячеек T4:AZ16 на странице М3 Hello, переходим на страницу M3 Knowledge. Выбираем ячейку T4, добавляем скопированный фрагмент T4:AZ16 получаем новый анализ служебной информации (рис. 20).
Для M3 Knowledge служебная информация дублирует служебную информацию для М3 Hello. Необходимо использовать аналогичную маску – 10.
Переходим ко второй составляющей – анализ рабочей области микрокода. Результат представлен на рисунке 21.
Необходимо внести несколько изменений. Сначала дополним таблицу 3 набором ячеек:
Hidden text
|
№ п/п |
Ячейка |
Функция |
|
Седьмая строка |
||
|
1. |
W35 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W34;$AX$23:$AX$36;0);ПОИСКПОЗ(W34;AM32:AZ32;0)) |
|
2. |
X35 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X34;$AW$23:$AW$36;0);ПОИСКПОЗ(X34;AM32:AZ32;0)) |
|
3. |
Y35 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y34;$AX$23:$AX$36;0);ПОИСКПОЗ(Y34;AM33:AZ33;0)) |
|
4. |
Z35 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z34;$AW$23:$AW$36;0);ПОИСКПОЗ(Z34;AM33:AZ33;0)) |
|
5. |
AA35 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA34;$AX$23:$AX$36;0);ПОИСКПОЗ(AA34;AM34:AZ34;0)) |
|
6. |
AB35 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB34;$AW$23:$AW$36;0);ПОИСКПОЗ(AB34;AM34:AZ34;0)) |
|
7. |
AC35 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC34;$AX$23:$AX$36;0);ПОИСКПОЗ(AC34;AM35:AZ35;0)) |
|
8. |
AD35 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AD34;$AW$23:$AW$36;0);ПОИСКПОЗ(AD34;AM35:AZ35;0)) |
|
Восьмая строка |
||
|
9. |
W37 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W36;$AX$23:$AX$36;0);ПОИСКПОЗ(W36;AM36:AZ36;0)) |
|
10. |
X37 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X36;$AW$23:$AW$36;0);ПОИСКПОЗ(X36;AM36:AZ36;0)) |
|
11. |
Y37 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y36;$AV$23:$AV$36;0);ПОИСКПОЗ(Y36;AM36:AZ36;0)) |
|
12. |
Z37 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z36;$AU$23:$AU$36;0);ПОИСКПОЗ(Z36;AM36:AZ36;0)) |
|
13. |
AA37 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA36;$AV$23:$AV$36;0);ПОИСКПОЗ(AA36;AM35:AZ35;0)) |
|
14. |
AB37 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB36;$AU$23:$AU$36;0);ПОИСКПОЗ(AB36;AM35:AZ35;0)) |
|
15. |
AC37 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC36;$AV$23:$AV$36;0);ПОИСКПОЗ(AC36;AM34:AZ34;0)) |
|
16. |
AD37 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AD36;$AU$23:$AU$36;0);ПОИСКПОЗ(AD36;AM34:AZ34;0)) |
|
Девятая строка |
||
|
17. |
W39 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W38;$AV$23:$AV$36;0);ПОИСКПОЗ(W38;AM33:AZ33;0)) |
|
18. |
X39 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X38;$AU$23:$AU$36;0);ПОИСКПОЗ(X38;AM33:AZ33;0)) |
|
19. |
Y39 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y38;$AV$23:$AV$36;0);ПОИСКПОЗ(Y38;AM32:AZ32;0)) |
|
20. |
Z39 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z38;$AU$23:$AU$36;0);ПОИСКПОЗ(Z38;AM32:AZ32;0)) |
|
21. |
AA39 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA38;$AV$23:$AV$36;0);ПОИСКПОЗ(AA38;AM31:AZ31;0)) |
|
22. |
AB39 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB38;$AU$23:$AU$36;0);ПОИСКПОЗ(AB38;AM31:AZ31;0)) |
|
23. |
AC39 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC38;$AV$23:$AV$36;0);ПОИСКПОЗ(AC38;AM30:AZ30;0)) |
|
24. |
AD39 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AD38;$AU$23:$AU$36;0);ПОИСКПОЗ(AD38;AM30:AZ30;0)) |
|
Десятая строка |
||
|
25. |
W41 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(W40;$AV$23:$AV$36;0);ПОИСКПОЗ(W40;AM29:AZ29;0)) |
|
26. |
X41 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(X40;$AU$23:$AU$36;0);ПОИСКПОЗ(X40;AM29:AZ29;0)) |
|
27. |
Y41 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Y40;$AV$23:$AV$36;0);ПОИСКПОЗ(Y40;AM28:AZ28;0)) |
|
28. |
Z41 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(Z40;$AU$23:$AU$36;0);ПОИСКПОЗ(Z40;AM28:AZ28;0)) |
|
29. |
AA41 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AA40;$AV$23:$AV$36;0);ПОИСКПОЗ(AA40;AM27:AZ27;0)) |
|
30. |
AB41 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AB40;$AU$23:$AU$36;0);ПОИСКПОЗ(AB40;AM27:AZ27;0)) |
|
31. |
AC41 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AC40;$AV$23:$AV$36;0);ПОИСКПОЗ(AC40;AM26:AZ26;0)) |
|
32. |
AD41 |
=ИНДЕКС($E$23:$R$36;ПОИСКПОЗ(AD40;$AU$23:$AU$36;0);ПОИСКПОЗ(AD40;AM26:AZ26;0)) |
Аналогично предыдущему этапу, в диапазоне ячеек W23:X23 указан код 10 – обозначает наличие байтового режима (таблица 2 ГОСТ). Следующий диапазон из 4-х бит в ячейках Y23:AB23 – диапазон, отображающий битовую комбинацию – 1001 или число 9 (по количеству искомых в микрокоде символов). Проверка в ячейке AD23 подтверждает полученное значение.
1. Добавим функции в ячейки, согласно следующей таблице:
|
Ячейка |
Функция |
|
AF35-AH35 |
=СЦЕП(W35:AD35) |
|
AF37-AH37 |
=СЦЕП(W37:AD37) |
|
AF39-AH39 |
=СЦЕП(W39:AD39) |
|
AF41-AH41 |
=СЦЕП(W41:AD41) |
2. Сравниваем полученные числовые значения со значениями на странице Code:
|
Ячейка |
Функция |
|
U25 |
=ЕСЛИ(AF25=Code!G9;Code!F9;»-«) |
|
U27 |
=ЕСЛИ(AF27=Code!G10;Code!F10;»-«) |
|
U29 |
=ЕСЛИ(AF29=Code!G11;Code!F11;»-«) |
|
U31 |
=ЕСЛИ(AF31=Code!G12;Code!F12;»-«) |
|
U33 |
=ЕСЛИ(AF33=Code!G13;Code!F13;»-«) |
|
U35 |
=ЕСЛИ(AF35=Code!G14;Code!F14;»-«) |
|
U37 |
=ЕСЛИ(AF37=Code!G15;Code!F15;»-«) |
|
U39 |
=ЕСЛИ(AF39=Code!G16;Code!F16;»-«) |
|
U41 |
=ЕСЛИ(AF41=Code!G17;Code!F17;»-«) |
3. В объединенной ячейке U35:AG35 изменим функцию:
=СЦЕП(U25;U27;U29;U31;U33;U35;U37;U39;U41)
1. В результате получаем полное совпадение кодовой составляющей.
Этап 5. Применение полученного алгоритма для M3 KaDaBrAOK
Аналогично предыдущей странице, для M3 KaDaBrAOK заготовлена битовая последовательность заранее, а алгоритм идентичен M3 Knowledge. Воспользуемся данным обстоятельством, продублируем страницу M3 Knowledge на M3 KaDaBrAOK с учетом замены исходного микрокода.
Копируем диапазон ячеек T4:AZ18 на странице M3 Knowledge, переходим на страницу M3 KaDaBrAOK. Выбираем ячейку T4, добавляем скопированный фрагмент T4:AZ18 получаем новый анализ служебной информации (рис. 22). Для M3 KaDaBrAOK служебная информация полностью дублирует служебную информацию для M3 Knowledge.
Переходим ко второй составляющей – анализ рабочей области микрокода. Результат представлен на рисунке 23.
Аналогично M3 KaDaBrAOK, в диапазоне ячеек W23:X23 указан код 10 – обозначает наличие байтового режима (таблица 2 ГОСТ). Следующий диапазон из 4-х бит в ячейках Y23:AB21 – диапазон, отображающий битовую комбинацию – 1001 или число 9 (по количеству искомых в микрокоде символов). Проверка в ячейке AD23 подтверждает полученное значение.
1. Вносим единственное изменение – изменяем функцию сравнения полученных числовых значений со значениями на странице Code:
|
Ячейка |
Функция |
|
U25 |
=ЕСЛИ(AF25=Code!G19;Code!F19;»-«) |
|
U27 |
=ЕСЛИ(AF27=Code!G20;Code!F20;»-«) |
|
U29 |
=ЕСЛИ(AF29=Code!G21;Code!F21;»-«) |
|
U31 |
=ЕСЛИ(AF31=Code!G22;Code!F22;»-«) |
|
U33 |
=ЕСЛИ(AF33=Code!G23;Code!F23;»-«) |
|
U35 |
=ЕСЛИ(AF35=Code!G24;Code!F24;»-«) |
|
U37 |
=ЕСЛИ(AF37=Code!G25;Code!F25;»-«) |
|
U39 |
=ЕСЛИ(AF39=Code!G26;Code!F26;»-«) |
|
U41 |
=ЕСЛИ(AF41=Code!G27;Code!F27;»-«) |
В результате получаем полное совпадение кодовой составляющей.
P.S.: как уже стало понятно из добавочных двух последних этапов, кодирование смешанных режимов никак не влияет на встроенный в модуль алгоритм. Следовательно, данный алгоритм, как и для других режимов, – ноу-хау программиста или программистов моделистов программного модуля Ассоциации. Согласно ГОСТ, необходимо использовать смешанные режимы для оптимизации кода.
Удачи в декодировании байтовых последовательностей
Micro QR Code версии M3!!!
ссылка на оригинал статьи https://habr.com/ru/articles/784254/
Добавить комментарий