Перейти к предыдущей части статьи
Соответственно, сильно отличаются алгоритмы превращения алфавитно-цифровой информации в последовательность черных и белых полос, которые называются штрихами и наносятся на различные поверхности. Сканируя эти штрихи специальным прибором, можно впоследствии считывать закодированную информацию в виде, удобном для дальнейшей обработки компьютерными системами.
Алгоритм превращения алфавитно-цифровой информации в последовательность штрихов называется «символогией» («symbology»). Если погуглить это слово совместно с названием той или другой штрих-кодовой системы, можно разобраться в принципах кодирования данной системы. Или не разобраться. Потому что симвология некоторых штрих-кодовых систем совсем не элементарна, Ватсон.
Примером штрих-кодовой кодировки с достаточно сложной символогией является система кодирования, которая называется EAN-13. Это очень распространенная система. Именно ее коды мы видим на всех продуктах, которые покупаем в магазинах. Именно благодаря EAN-13 резко сократилось время обслуживания клиентов на кассах расчета. Поэтому тем, кто хочет понять, как из цифр получаются штриховые метки и как эти метки потом превращаются в цифровые сигналы, стоит немного поломать голову и разобраться с устройством именно этой системы кодирования информации.
Для начала рассмотрим, как устроена штрих-кодовая метка. Собственно код размещается в пространстве, которое слева и справа окаймляют так называемые ограждающие штрих-кодовые полосы (guard bars). Эти полосы содержат штрихи единичной ширины, два темных и один светлый между ними. Если темные штрихи обозначать цифрой 1, а светлые — цифрой 0, то ограждающие полосы будут иметь код 101. Ограждающие полосы служат для синхронизации работы сканера, поэтому их иногда называют старт-стоповыми полосами (start and stop sentinel).
Штрихи единичной толщины, темные или светлые, называются модулями. Каждая цифра штрих-кода кодируется 7 модулями. Всего код EAN-13 состоит из 12 цифр. Общее число модулей, используемых для записи 12 цифр, равно 12×7=84.
Пространство, занятое самим штрих-кодом, делится на две группы — левую и правую, по 6 цифр в каждой. Эти группы разделяются специальной средней разделительной полосой, которая состоит из 5 штрихов — трех светлых и двух темных (код 01010). Средняя разделительная полоса, также как и ограждающие полосы, является управляющим элементом. Управляющие элементы содержат 11 модулей. Таким образом, суммарная ширина штрих-кода всегда равна 95 модулям.
Чем меньше ширина модуля, тем компактнее штрих-код. С другой стороны, слишком тонкий штрих трудно четко напечатать и трудно без ошибок прочесть. Стандартная ширина модуля, обеспечивающая наилучшее считывание при минимальном размере, имеет значение 0.33 мм. Таким образом, ширина полосы штрих-кода обычно равна 0.33×95=31.35 мм.
Все не управляющие элементы штрих-кода EAN-13 — закодированные цифры. Обычно эти цифры распечатывают под штрих-кодом или над ним. Эта информация предназначена для оператора-человека, который, в отличие от сканера, лихо считывать штрих-коды не может. Зато он может вручную ввести требуемый код, если сканер по какой-то причине сбоит.
Каждая цифра кодируется 7 модулями темного или светлого цвета или, что-то же самое, 7 двоичными разрядами. Пробелов между штрихами нет. Поэтому несколько рядом стоящих темных или светлых штрихов сливаются в более толстые штрихи того или иного цвета. Система кодировки сделана так, чтобы каждая цифра изображалась только 4 утолщенными штрихами. Благодаря этому вся метка штрих-кода будет состоять из 29 светлых и 30 тёмных штрихов, включая штрихи ограждающих полос и средней разделительной полосы.
Разделительная полоса — хорошее название. Сразу возникает ассоциация с шоссе, где по одну сторону от разделительной полосы машины движутся в одну сторону, а по другую — в противоположную. Так вот, главный сюрприз кодовой системы EAN-13 — это то, что цифры в левой части штрих-кода и в правой его части кодируются по-разному. Эти кодировки называются, соответственно, L-кодом и R-кодом.
Для каждой кодируемой цифры L-код является фотографически негативным исполнением R-кода. Там, где у L-кода стоит 0, в R-коде стоит 1. Если суммировать L-код и R-код, получится число, состоящее из семи единиц. Все L-коды начинаются с 0, в то время как все R-коды начинаются с 1. Кроме того, сумма единиц в L-коде всегда нечетная, а в R-коде — всегда четная.
Почему нельзя было обойтись одной кодировкой? Потому что на практике часто приходится сканировать штрих-код, перевернутый «вверх тормашками». Как при этом определить, в каком положении находится читаемый штрих-код — в прямом или в перевернутом? Схема сканера определяет это довольно просто. Если первая из прочтенных групп (левая) начинается с 0, а вторая с 1, то штрих-код при чтении находился в прямом положении. Если же первая группа начинается с 1, а вторая с 0, произошло чтение штрих-кода, повернутого на 180 градусов. В первом случае расшифровка происходит с помощью таблицы прямой кодировки, а во втором — с помощью таблицы обратной кодировки, коды в которой являются зеркальным отражением кодов таблицы прямой кодировки.
Что же получается? В символогии штрих-кода EAN-13 одна цифра должна кодироваться четырьмя способами: L-код и R-код — для прямого чтения, и для чтения обратного — еще одна пара, тоже состоящая из L-кода и R-кода? Как говорила (правда, по другому поводу) юная Гюльчатай из «Белого солнца пустыни», тяжело. В самом деле, нелегко. Но необходимо.
Ах, какие "схватки боевые" гремели на ШЖ 10 лет назад... Но - иных уж нет, а те - далече. Надорвались прометеисты и цивилизаторы.