линейный штриховой код code 128 это

GS1-128 (ранее известный как UCC / EAN-128) является подмножеством Code 128 и широко используется во всем мире в отраслях судоходства и упаковки в качестве идентификационного кода продукта для уровней контейнера и поддона в цепочке поставок.

СОДЕРЖАНИЕ

Технические характеристики

Штрих-код Code 128 состоит из семи разделов:

Контрольный символ рассчитывается из взвешенной суммы ( по модулю 103) всех символов.

Подтипы

Код 128 включает 108 символов: 103 символа данных, 3 начальных символа и 2 символа остановки. Каждый символ состоит из трех черных полос и трех белых промежутков разной ширины. Все ширины кратны базовому «модулю». Каждая полоса и пробел имеют ширину от 1 до 4 модулей, а символы имеют фиксированную ширину: сумма ширины трех черных полос и трех белых полос составляет 11 модулей.

Шаблон остановки состоит из двух перекрывающихся символов и четырех полосок. Шаблон остановки разрешает двунаправленное сканирование. Когда шаблон остановки читается слева направо (обычный случай), распознается символ остановки (за которым следует двухмодульная полоса). Когда шаблон остановки читается справа налево, распознается символ обратного останова (за которым следует двухмодульная полоса). Сканер, который видит символ обратного останова, знает, что он должен пропустить двухмодульную полосу и прочитать остальную часть штрих-кода в обратном порядке.

Несмотря на свое название, Code 128 не имеет 128 различных символов, поэтому он не может напрямую представлять 128 кодовых точек. Чтобы представить все 128 значений ASCII, он переключается между тремя кодовыми наборами (A, B, C). Вместе кодовые наборы A и B охватывают все 128 символов ASCII. Кодовый набор C используется для эффективного кодирования цепочек цифр. Начальное подмножество выбирается с помощью соответствующего начального символа. В каждом кодовом наборе некоторые из 103 кодовых точек данных зарезервированы для перехода к одному из двух других кодовых наборов. Сдвиги выполняются с использованием кодовых точек 98 и 99 в кодовых наборах A и B, 100 в кодовых наборах A и C и 101 в кодовых наборах B и C для переключения между ними):

Старт / стоп и закодированные данные

Расчет контрольной цифры

Например, в следующей таблице для буквенно-цифровой строки PJJ123C вычисляется значение контрольной суммы варианта A кода 128:

Код Ценить Позиция Значение ×
позиция
Начальный код A 103 1 103
п 48 1 48
J 42 2 84
J 42 3 126
1 17 4 68
2 18 5 90
3 19 6 114
C 35 год 7 245
Сумма 878
Остаток по модулю 103 54

Использование FNC4 для кодирования высоких (128–255) символов

Ширина штрих-кода

Code128 определяет комбинацию из 6 чередующихся полосок и пробелов (по 3 каждого) для каждого символа. Таким образом, каждый символ начинается с полосы и заканчивается пробелом. В шрифтах штрих-кода последняя полоса обычно сочетается с символом остановки, чтобы создать более широкий шаблон остановки. В следующей таблице указаны значения ширины каждой полосы и пробела для каждого символа. Ширина каждой планки или пробела может составлять 1, 2, 3 или 4 единицы (модуля). В приведенном выше примере буква «А» будет изображена с рисунком 10100011000 или шириной 111323 в таблицах ниже.

Значение ширины получается путем подсчета длины каждого ряда единиц, затем нулей в шаблоне, начиная слева. Всегда будет 6 прогонов, и длина этих 6 прогонов формирует значение ширины. Например, при использовании шаблона 10100011000 длины серий будут 1 (цифра 1), 1 (цифра 0), 1 (цифра 1), 3 (цифра 0), 2 (цифра 1), 3 (цифра 0). Если указать только длину каждого прогона, получится 1, 1, 1, 3, 2, 3, что приведет к значению ширины 111323.

Код 128

Ценить Шестнадцатеричное значение 128A 128B 128C Положение шрифта
(Обычный / Необычный / Barcodesoft)
Бар / Пробел
Код Latin-1 Шаблон Ширина
0 00 Космос Космос 00 32 или 194 или 207/212/252 ␣ или Â или Ï / Ô / ü 11011001100 212222
1 01 ! ! 01 33 ! 11001101100 222122
2 02 « « 02 34 « 11001100110 222221
3 03 # # 03 35 год # 10010011000 121223
4 04 $ $ 04 36 $ 10010001100 121322
5 05 % % 05 37 % 10001001100 131222
6 06 & & 06 38 & 10011001000 122213
7 07 07 39 10011000100 122312
8 08 ( ( 08 40 ( 10001100100 132212
9 09 ) ) 09 41 год ) 11001001000 221213
10 0a * * 10 42 * 11001000100 221312
11 0b + + 11 43 год + 11000100100 231212
12 0c , , 12 44 год , 10110011100 112232
13 0d 13 45 10011011100 122132
14 0e . . 14 46 . 10011001110 122231
15 0f / / 15 47 / 10111001100 113222
16 10 0 0 16 48 0 10011101100 123122
17 11 1 1 17 49 1 10011100110 123221
18 12 2 2 18 50 2 11001110010 223211
19 13 3 3 19 51 3 11001011100 221132
20 14 4 4 20 52 4 11001001110 221231
21 год 15 5 5 21 год 53 5 11011100100 213212
22 16 6 6 22 54 6 11001110100 223112
23 17 7 7 23 55 7 11101101110 312131
24 18 8 8 24 56 8 11101001100 311222
25 19 9 9 25 57 год 9 11100101100 321122
26 год : : 26 год 58 : 11100100110 321221
27 1b ; ; 27 59 ; 11101100100 312212
28 год 1c > 30 62 > 11011011000 212123
31 год 1f ? ? 31 год 63 ? 11011000110 212321
32 20 @ @ 32 64 @ 11000110110 232121
33 21 год А А 33 65 А 10100011000 111323
34 22 B B 34 66 B 10001011000 131123
35 год 23 C C 35 год 67 C 10001000110 131321
36 24 D D 36 68 D 10110001000 112313
37 25 E E 37 69 E 10001101000 132113
38 26 год F F 38 70 F 10001100010 132311
39 27 грамм грамм 39 71 грамм 11010001000 211313
40 28 год ЧАС ЧАС 40 72 ЧАС 11000101000 231113
41 год 29 я я 41 год 73 я 11000100010 231311
42 J J 42 74 J 10110111000 112133
43 год 2b K K 43 год 75 K 10110001110 112331
44 год 2c L L 44 год 76 L 10001101110 132131
45 2d M M 45 77 M 10111011000 113123
46 2e N N 46 78 N 10111000110 113321
47 2f О О 47 79 О 10001110110 133121
48 30 п п 48 80 п 11101110110 313121
49 31 год Q Q 49 81 год Q 11010001110 211331
50 32 р р 50 82 р 11000101110 231131
51 33 S S 51 83 S 11011101000 213113
52 34 Т Т 52 84 Т 11011100010 213311
53 35 год U U 53 85 U 11011101110 213131
54 36 V V 54 86 V 11101011000 311123
55 37 W W 55 87 W 11101000110 311321
56 38 Икс Икс 56 88 Икс 11100010110 331121
57 год 39 Y Y 57 год 89 Y 11101101000 312113
58 Z Z 58 90 Z 11101100010 312311
59 3b [ [ 59 91 [ 11100011010 332111
60 3c \ \ 60 92 \ 11101111010 314111
61 3d ] ] 61 93 ] 11001000010 221411
62 3e ^ ^ 62 94 ^ 11110001010 431111
63 3f _ _ 63 95 _ 10100110000 111224
64 40 NUL ` 64 96 ` 10100001100 111422
65 41 год SOH а 65 97 а 10010110000 121124
66 42 STX б 66 98 б 10010000110 121421
67 43 год ETX c 67 99 c 10000101100 141122
68 44 год EOT d 68 100 d 10000100110 141221
69 45 ENQ е 69 101 е 10110010000 112214
70 46 ACK ж 70 102 ж 10110000100 112412
71 47 BEL грамм 71 103 грамм 10011010000 122114
72 48 BS час 72 104 час 10011000010 122411
73 49 HT я 73 105 я 10000110100 142112
74 LF j 74 106 j 10000110010 142211
75 4b VT k 75 107 k 11000010010 241211
76 4c FF л 76 108 л 11001010000 221114
77 4d CR м 77 109 м 11110111010 413111
78 4e ТАК п 78 110 п 11000010100 241112
79 4f SI о 79 111 о 10001111010 134111
80 50 DLE п 80 112 п 10100111100 111242
81 год 51 DC1 q 81 год 113 q 10010111100 121142
82 52 DC2 р 82 114 р 10010011110 121241
83 53 DC3 s 83 115 s 10111100100 114212
84 54 DC4 т 84 116 т 10011110100 124112
85 55 НАК ты 85 117 ты 10011110010 124211
86 56 SYN v 86 118 v 11110100100 411212
87 57 год ETB ш 87 119 ш 11110010100 421112
88 58 ЖЕСТЯНАЯ БАНКА Икс 88 120 Икс 11110010010 421211
89 59 ЭМ у 89 121 у 11011011110 212141
90 SUB z 90 122 z 11011110110 214121
91 5b ESC < 91 123 < 11110110110 412121
92 5c FS | 92 124 | 10101111000 111143
93 5d GS > 93 125 > 10100011110 111341
94 5e RS 10001011110 131141
95 5f нас DEL 95 195/200/240 Ã / È / ð 10111101000 114113
96 60 FNC 3 FNC 3 96 196/201/241 Ä / É / ñ 10111100010 114311
97 61 FNC 2 FNC 2 97 197/202/242 Å / Ê / ò 11110101000 411113
98 62 Сдвиг B Сдвиг А 98 198/203/243 Æ / Ë / ó 11110100010 411311
99 63 Код C Код C 99 199/204/244 Ç / Ì / ô 10111011110 113141
100 64 Код B FNC 4 Код B 200/205/245 È / Í / õ 10111101110 114131
101 65 FNC 4 Код А Код А 201/206/246 É / Î / ö 11101011110 311141
102 66 FNC 1 FNC 1 FNC 1 202/207/247 Ê / Ï / ÷ 11110101110 411131
103 67 Начальный код A 203/208/248 Ë / Ð / ø 11010000100 211412
104 68 Начальный код B 204/209/249 Ì / Ñ / ù 11010010000 211214
105 69 Начальный код C 205/210/250 Í / Ò / ú 11010011100 211232
106 Стоп 11000111010 233111
Обратный стоп 11010111000 211133
Стоп-паттерн (7 баров / пробелов) 206/211/251 Î / Ó / û 1100011101011 2331112

Символы «Код A», «Код B» и «Код C» заставляют все следующие символы интерпретироваться согласно соответствующему субкоду (то есть 128A, 128B или 128C). Символ «Shift» переключает интерпретацию одного следующего символа между подкодами A и B.

Закодированный символ ASCII зависит от фактического используемого шрифта штрих-кода. В частности, символ ASCII со значением 0 и значением 95 и выше может быть определен по-разному в установленном шрифте.

Расчет контрольной цифры для указанного выше примера почтового индекса:

Ценить Масса Вес × значение
Начать C 105 1 105
FNC1 102 1 102
42 42 2 84
18 18 3 54
40 40 4 160
20 20 5 100
50 50 6 300
Код А 101 7 707
0 16 8 128
Сумма = 1740 г.
1740 г. Мод 103 = 92

Доступность

Для конечного пользователя штрих-коды Code 128 могут быть сгенерированы либо внешним приложением для создания изображения штрих-кода, либо решением для штрих-кода на основе шрифтов. Любое решение требует использования приложения или надстройки приложения для вычисления контрольной цифры и создания штрих-кода.

Оптимизация длины штрих-кода

Использование кодового набора C выгодно только при следующих условиях:

Расположение цифр Количество последовательных цифр
начало данных 4+
конец данных 4+
середина данных (окружена символами из кодового набора A или B) 6+
все данные либо 2, либо 4+ (но не 3)

Оптимальное кодирование может быть найдено с использованием динамического программирования алгоритма.

Источник

Как устроен штрихкод?

Со штрихкодами современный человек сталкивается каждый день, даже не задумываясь об этом. Когда мы покупаем в супермаркете продукты, их коды считываются именно с помощью штрихкода. Также посылки, товары на складах, и прочее и прочее. Однако, мало кто знает, как же реально это работает.

Как устроен баркод, и что закодировано на этой картинке?

Попробуем разобраться, заодно напишем декодер таких кодов.

Введение

Использование штрихкодов имеет давнюю историю. Первые попытки автоматизации начинались еще в 50х, патент на устройство считывания кодов был получен в 1952г. Инженер, занимавшийся сортировкой вагонов на железной дороге, захотел упростить процесс. Идея была очевидной — кодировать номер с помощью полос и считывать их с помощью фотоэлементов. В 1962г коды стали официально использоваться для идентификации вагонов на американской железной дороге (система KarTrak), в 1968 прожектор заменили лазерным лучом, что позволило повысить точность и уменьшить размер считывателя. В 1973г появился формат «универсального кода продукта» (Universal Product Code), и в 1974 с использованием сканера кодов был продан первый продукт (жевательная резинка Wrigley’s — это же США;) в супермаркете. В 1984 треть магазинов использовали штриходы, в России же они начали использоваться примерно с 90х годов.

Разных кодов под разные задачи сейчас используется довольно много, к примеру, последовательность «12345678» может быть представлена такими способами (и это еще не все):

Приступим к побитовому разбору. Далее, все ниженаписанное будет относиться к виду «Code-128» — просто потому, что его формат довольно простой и понятный. Желающие поэкспериментировать с другими видами, могут открыть онлайн-генератор и посмотреть самостоятельно.

На первый взгляд штрихкод кажется просто беспорядочной последовательностью линий, на самом деле, его структура четко фиксирована:

1 — Пустое место, нужное для четкого определения начала кода
2 — Стартовый символ. Для Code-128 возможны 3 варианта (называемых А, В и С): 11010000100, 11010010000 или 11010011100, им соответствуют разные кодовые таблицы (подробнее в Википедии).
3 — Собственно код, содержащий нужные нам данные
4 — Контрольная сумма
5 — Стоп символ. Для Code-128 это 1100011101011.
6(1) — Пустое место.

Теперь о том, как кодируются биты. Тут все очень просто — если взять ширину самой тонкой линии за «1», то линия двойной ширины даст код «11», тройная «111», и так далее. Пустое место будет «0» или «00» или «000» по тому же самому принципу. Желающие могут сравнить стартовый код на картинке, чтобы убедиться что правило выполняется.

Теперь можно начинать программировать.

Получаем битовую последовательность

В принципе, это самая сложная часть, и разумеется, алгоритмически ее можно реализовать по-разному. Не уверен, что приведенный ниже алгоритм оптимальный, но для учебного примера его вполне достаточно.

Для начала загрузим изображение, растянем его по ширине, возьмем из середины изображения горизонтальную линию, преобразуем ее в ч/б и загрузим в виде массива.

На штрихкоде черному соответствует «1», а в RGB наоборот, 0, так что массив нужно инвертировать. Заодно вычислим среднее значение.

Запускаем программу, чтобы убедиться, что баркод загружен корректно:

Теперь нужно определить ширину одного «бита». Для этого мы выделим начало стартовой последовательности «1101», записывая моменты перехода графика через среднюю линию.

Мы записываем только переходы через середину, так что код «1101» будет записан как «101», но нам этого достаточно чтобы узнать его ширину в пикселах.

Теперь собственно декодирование. Находим очередной переход через середину, и определяем число бит, попавших в интервал. Поскольку совпадение не абсолютное (код может быть слегка изогнут или растянут), используем округление.

Не уверен что это оптимальный вариант, возможно, есть способ лучше, желающие могут написать в комментариях.

Если все было сделано правильно, то мы получаем на выходе примерно такую последовательность:

11010010000110001010001000110100010001101110100011011101000111011011
01100110011000101000101000110001000101100011000101110110011011001111
00010101100011101011

Декодирование

Здесь никаких сложностей в принципе, нет. Символы в Code-128 кодируются 11-битным кодом, который имеет 3 разновидности (А, В и С) и может хранить либо разные кодировки символов, либо цифры от 00 до 99.

В нашем случае, начало последовательности 11010010000, что соответствует «Code B». Было жутко влом вбивать вручную все коды из Википедии, поэтому таблица была просто скопирована из браузера и ее парсинг был тоже сделан на Python (hint: на продакшене так делать не надо).

Теперь осталось самое простое. Разбиваем нашу битовую последовательность на 11-символьные блоки:

Наконец, формируем строку и выводим ее на экран:

Ответ на то, что закодировано в таблице, приводить не буду, пусть это будет домашним заданием для читателей (использование готовых программ для смартфонов будет считаться читерством:).

В коде также не реализована проверка CRC, желающие могут сделать это самостоятельно.

Разумеется, алгоритм неидеален, и был написан за полчаса. Для более профессиональных целей есть готовые библиотеки, например pyzbar. Код с использованием такой библиотеки займет всего 4 строчки:

(предварительно нужно установить библиотеку, введя команду «pip install pyzbar»)

Дополнение: о подсчете CRC написал в комментариях пользователь vinograd19:

Интересна история контрольной цифры. Она возникла эволюционно.
Контрольная цифра нужна для того, чтобы избежать неправильного декодирования. Если штрихкод был 1234, а его распознали как 7234, то нужна валидация, которая предупредит замену 1 на 7. Валидация может быть неточная, чтобы хотя бы в 90% невалидные номера определялись заранее.

1-й подход: Давайте просто возьмем сумму. Чтобы в остатке от деления на 10 был 0. Ну то есть первые 12 символов несут информационную нагрузку, а последняя цифры подбирается так, чтобы сумма цифр делилась на 10. Декодируем последовательность, если сумма не делится на десять — значит декодировали с багом и нужно сделать это еще раз. Например, код 1234 — валидный. 1+2+3+4 = 10. Код 1216 — тоже валидный, а вот 1218 — нет.

Это позволяет избежать проблем с автоматикой. Однако в момент создания штрихкодов был фоллбек в виде набивания номер на клавишах. И там есть плохой кейс: если поменять порядок следования двух цифр, то контрольная сумма не меняется, и это плохо. То есть если штрихкод 1234 был вбит как 2134, контрольная сумма сойдется, а вот номер мы вбили неправильный. Оказывается, неправильный порядок цифр — это распространенный кейс, если стучать по клавишам быстро.

2-й подход. Хорошо, давайте сумму сделаем чуть сложнее. Чтобы цифры на четных местах учитывались дважды. Тогда при изменении порядка, сумма точно не сойдется к нужной. Например код 2364 валидный (2 + 3+3 + 6 + 4+4 = 20), а код 3264 — невалидный (3+ 2+2 + 6 + 4+4 = 19). Но тут оказался еще один плохой пример вбития. Некоторые клавиатуры такие, что десять цифр располагаются в два ряда. первый ряд 12345 и под ним второй второй ряд 67890. Если вместо клавишы «1» нажать правее клавишу «2», то контрольная сумма предупредит неправильный ввод. А вот если вместо клавишу «1» нажать ниже клавишу «6» — то может не предупредить. Ведь 6=1+5, и в случае когда эта цифра стоит на четном месте при вычислении контрольной суммы, мы имеем 2*6 = 2*1 + 2*5. То есть контрольная сумму увеличилась ровно на 10, поэтому ее последняя цифра не изменилась. Например контрольные суммы кодв 2134 и 2634 одинаковые. Та же ошибка будет, если мы вместо 2 нажмем 7, вместо 3 нажмем 8 и тд.

3-й подход. Ок, давайте что ли возьмем опять сумму, только цифры, стоящие на четных местах будем учитывать… трижды. То есть код 1234565 — валидный, потому как 1 + 2*3 + 3 + 4*3 + 5 + 6*3 +5 = 50.

Описанный способ стал стандартом вычисления контрольной суммы EAN13 за небольшими правками: число цифр стало фиксированным и равно 13, где 13-ая — это та самая контрольная цифра. Цифры на нечетных местах считаются трижды, на четных — один раз.

Заключение

Как можно видеть, даже такая простая вещь как штрихкод, имеет в себе немало интересного. Кстати, еще один лайфхак для тех, кто дочитал до сюда — текст под штрихкодом (если он есть) полностью дублирует его содержание. Это сделано для того, чтобы в случае нечитабельности кода, оператор мог ввести его вручную. Так что узнать содержимое штрихкода обычно просто — достаточно посмотреть на текст под ним.

Как подсказали в комментариях, наиболее популярным в торговле является код EAN-13, битовое кодирование там такое же, а структуру символов желающие могут посмотреть самостоятельно.

Если у читателей не пропал интерес, отдельно можно рассмотреть QR-коды.

Источник

Читайте также:  код страны 542 по штрих коду
Онлайн платформа