Какая информация может содержаться в штрихкоде

Штриховой код – это последовательность черных и белых полос, представляющая некоторую информацию в виде, удобном для считывания техническими средствами. Информация, содержащаяся в коде может быть напечатана в читаемом виде под кодом (расшифровка). Штриховые коды используются в торговле, складском учете, библиотечном деле, охранных системах, почтовом деле, сборочном производстве, обработка документов. В мировой практике торговли принято использование штрихкодов символики GTIN для маркировки товаров. В соответствии с принятым порядком, производитель товара наносит на него штриховой код, формируемый с использованием данных о стране местонахождения производителя и кода производителя. Код производителя присваивается при содействии регионального отделения международной организации GS1 International. Такой порядок регистрации позволяет исключить возможность появления двух различных товаров с одинаковыми кодами.

Существуют различные способы кодирования информации, называемые (штрихкодовыми кодировками или символиками). Различают линейные и двухмерные символики штрихкодов.

Линейными (обычными) в отличие от двухмерных называются штрихкоды, читаемые в одном направлении (по горизонтали). Наиболее распространненые линейные символики: GTIN, UPC, Code39, Code128, Codabar, Interleaved 2 of 5. Линейные символики позоволяют кодировать небольшой объем информации (до 20-30 символов – обычно цифр) с помощью несложных штрихкодов, читаемых недорогими сканерами. Пример кода символики GTIN-13:

 

Двухмерными называются символики, разработанные для кодирования большого объема информации (до нескольких страниц текста). Двухмерный код считывается при помощи специального сканера двухмерных кодов и позволяет быстро и безошибочно вводить большой объем информации. Расшифровка такого кода проводится в двух измерениях (по горизонтали и по вертикали). Datamatrix, Data Glyph, Aztec.

 

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

Для считывания штрихкодов используются специальные приборы, называемые сканерами штриховых кодов. Сканер засвечивает штрихкод своим осветителем и считывает полученную картинку. После этого он определяет наличие на картинке черных полос штрихкода. Если в сканере нет встроенного декодера (блок расшифровки штрихкода), то сканер передает в приемное устройство серию сигналов, соответствующих ширине черных и белых полос. Расшифровка штрихкода должна выполняться приемным устройством или внешним декодером. Если сканер оснащен внутренним декодером, то этот декодер расшифровывает штрихкод и передает информацию в приемное устройство (компьютер, кассовый аппарат и т.д.) в соответствии с сигналами интерфейса, определяемого моделью сканера.

Расшифровка штрихкода. C помощью штрихового кода зашифрована информация о некоторых наиболее существенных параметрах продукции. Наиболее распространены американский Универсальный товарный код UPC и Европейская система кодирования GTIN. Наиболее распространенны GTIN/UCC товарные номера GTIN-13, GTIN-8, UPC-A, UPC-E и 14-разрядный код транспортной упаковки ITF-14. Так же существует 128 разрядная система UCC/GTIN-128. Согласно той или иной системе, каждому виду изделия присваивается свой номер, состоящий чаще всего из 13 цифр (GTIN-13).

Возьмем, к примеру, цифровой код: 4820024700016. Первые две цифры (482) означают страну происхождения (изготовителя или продавца) продукта, следующие 4 или 5 в зависимости от длинны кода страны (0024) – предприятие-изготовитель, еще пять (70001) – наименование товара, его потребительские свойства, размеры, массу, цвет. Последняя цифра (6) контрольная, используемая для проверки правильности считывания штрихов сканером. GTIN – 13:

 

Для кода товара:
1 цифра: наименование товара,
2 цифра: потребительские свойства,
3 цифра: размеры, масса,
4 цифра: ингредиенты,
5 цифра: цвет.

Пример вычисления контрольной цифры для определения подлинности товара
1. Сложить цифры, стоящие на четных местах:
8+0+2+7+0+1=18
2. Полученную сумму умножить на 3:
18×3=54
3. Сложить цифры, стоящие на нечетных местах, без контрольной цифры:
4+2+0+4+0+0=10
4. Сложить числа, указанные в пунктах 2 и 3:
54+10=64
5. Отбросить десятки:
получим 4
6. Из 10 вычесть полученное в пункте 5:
10-4=6

Если полученная после расчета цифра не совпадает с контрольной цифрой в штрихкоде, это значит, что товар произведен незаконно.

Для кода страны-изготовителя отводится два или три знака, а для кода предприятия – четыре или пять. Товары, имеющие не большие размеры, могут иметь короткий код, состоящий из восьми цифр – GTIN-8.

Как правило, код страны присваивается Международной ассоциацией GS1. Обращаем внимание потребителей на то, что код странны никогда не состоит из одной цифры. Иногда код, нанесенный на этикетку, не соответствует стране изготовителю заявленной на упаковке, тут причин может быть несколько. Первая: фирма была зарегистрирована и получила код не в своей стране, а в той, куда направлен основной экспорт ее продукции. Вторая: товар был изготовлен на дочернем предприятии. Третья: возможно, товар был изготовлен в одной стране, но по лицензии фирмы из другой страны. Четвертая – когда учредителями предприятия становятся несколько фирм из различных государств.

Таблица соответствия штрихкодов стран в системе “GS1″.

СТРАНА

 ШТРИХ-КОД 

Австралия

93

Австрия

90-91

Аргентина

779

Бельгия

54

Болгария

380

Боливия

777

Босния

387

Бразилия

789

Великобритания

50

Венгрия

599

Венесуэла

759

Вьетнам

893

Гваделупа

489

Гватемала

740-745

Германия

400-440

Гондурас

740-745

Греция

520

Дания

57

Доминиканская республика

746

Израиль

729

Индия

890

Индонезия

899

Ирландия

539

Исландия

569

Испания

84

Италия

80-83

Канада

00-09

Кипр

529

Китай

690-691

Колумбия

770

Коста-Рика

740-745

Куба

850

Латвия

475

Литва

477

Люксембург

54

Мавритания

609

Малайзия

955

Мальта

535

Марокко и Западная Сахара

611

Мексика

750

Молдова

484

Нидерланды

87

Никарагуа

740-745

Новая Зеландия

94

Норвегия

70

Панама

740-745

Парагвай

784

Перу

775

Польша

590

Португалия

560

Россия

460

Румыния

594

Сальвадор

740-745

Сербия

860

Сингапур

888

Словакия

858

Словения

383

США

00-09

Таиланд

885

Тайвань

471

Тунис

619

Турция

869

Украина

482

Уругвай

773

Филиппины

480

Финляндия

64

Франция

30-37

Хорватия

385

Чехия

859

Чили

780

Швейцария

76

Швеция

73

Шри-Ланка

479

Эквадор

786

Эстония

474

Южная Корея

880

Южно-Африканская Республика

600-601

Япония

49

Источник

Штриховой код (штрихкод). Описание, виды и расшифровка штрихкодаШтриховой код (штрихкод) — это последовательность черных и белых полос, представляющая некоторую информацию в виде, удобном для считывания техническими средствами. Информация, содержащаяся в коде может быть напечатана в читаемом виде под кодом (расшифровка).

Штриховые коды используются в торговле, складском учете, библиотечном деле, охранных системах, почтовом деле, сборочном производстве, обработка документов.

В мировой практике торговли принято использование штрихкодов символики EAN для маркировки товаров. В соответствии с принятым порядком, производитель товара наносит на него штриховой код, формируемый с использованием данных о стране местонахождения производителя и кода производителя. Код производителя присваивается региональным отделением международной организации EAN International. Такой порядок регистрации позволяет исключить возможность появления двух различных товаров с одинаковыми кодами.

История изобретения штрихкода

В 1948 году Бернард Сильвер (Bernard Silver) (1924—1962), аспирант Института Технологии Университета Дрекселя (Drexel University) в Филадельфии, услышал, как президент местной продовольственной сети просил одного из деканов разработать систему, автоматически считывающую информацию о продукте при его контроле. Сильвер рассказал об этом друзьям — Норману Джозефу Вудланду (Norman Joseph Woodland) (род. 1921) и Джордину Джохэнсону (Jordin Johanson). Втроём они начали исследовать различные системы маркировки. Их первая работающая система использовала ультрафиолетовые чернила, но они были довольно дороги, а кроме того, со временем исчезали.

Убеждённый в том, что система реализуема, Вудланд покинул Филадельфию и перебрался во Флориду в апартаменты своего отца для продолжения работы. Его следующее вдохновение неожиданно дала Азбука Морзе — он сформировал свой первый штриховой код из песка на берегу. Как он сам сказал: «Я только расширил точки и тире вниз и сделал из них узкие и широкие линии». Чтобы прочитать штрихи, он приспособил технологию саундтрек (звуковой дорожки), а именно оптический саундтрек, используемую для записи звука в кинофильмах. 20 октября 1949 года Вудланд и Сильвер подали заявку на изобретение. В результате ими был получен патент США № 2 612 994, изданный 7 октября 1952.

В 1951 году Вудланд и Сильвер попытались заинтересовать компанию IBM в развитии их системы. Компания, признав реализуемость и привлекательность идеи, отказалась от её реализации. IBM посчитала, что обработка получающейся информации потребует сложного оборудования, и что его разработку она сможет провести при наличии свободного времени в будущем.

В 1952 году Вудланд и Сильвер продали патент компании Филко (Philco — в дальнейшем известна как Helios Electric Company). В том же самом году Филко перепродала патент компании RCA.

Виды штрихкода

Существуют различные способы кодирования информации, называемые (штрихкодовыми кодировками или символиками). Различают линейные и двухмерные символики штрихкодов.

Линейными (обычными) в отличие от двухмерных называются штрихкоды, читаемые в одном направлении (по горизонтали). Наиболее распространненые линейные символики: EAN, UPC, Code39, Code128, Codabar, Interleaved 2 of 5. Линейные символики позоволяют кодировать небольшой объем информации (до 20-30 символов — обычно цифр) с помощью несложных штрихкодов, читаемых недорогими сканерами. Пример кода символики EAN-13:

В некоторых странах, например в Японии, можно встретить штрихкод в несколько необычном виде, но суть значения кода от этого не меняется:

Дизайнерский штрихкод

.

Двухмерными называются символики, разработанные для кодирования большого объема информации (до нескольких страниц текста). Двухмерный код считывается при помощи специального сканера двухмерных кодов и позволяет быстро и безошибочно вводить большой объем информации. Расшифровка такого кода проводится в двух измерениях (по горизонтали и по вертикали).

………… …………

Datamatrix …………Data Glyph……………………Aztec

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

Для считывания штрихкодов используются специальные приборы, называемые сканерами штриховых кодов. Сканер засвечивает штрихкод своим осветителем и считывает полученную картинку. После этого он определяет наличие на картинке черных полос штрихкода. Если в сканере нет встроенного декодера (блок расшифровки штрихкода), то сканер передает в приемное устройство серию сигналов, соответствующих ширине черных и белых полос. Расшифровка штрихкода должна выполняться приемным устройством или внешним декодером. Если сканер оснащен внутренним декодером, то этот декодер расшифровывает штрихкод и передает информацию в приемное устройство (компьютер, кассовый аппарат и т.д.) в соответствии с сигналами интерфейса, определяемого моделью сканера.

Расшифровка штрихкода

C помощью штрихового кода зашифрована информация о некоторых наиболее существенных параметрах продукции. Наиболее распространены американский Универсальный товарный код UPC и Европейская система кодирования EAN. Наиболее распространенны EAN/UCC товарные номера EAN-13, EAN-8, UPC-A, UPC-E и 14-разрядный код транспортной упаковки ITF-14. Так же существует 128 разрядная система UCC/EAN-128. Согласно той или иной системе, каждому виду изделия присваивается свой номер, состоящий чаще всего из 13 цифр (EAN-13).

Возьмем, к примеру, цифровой код: 4820024700016. Первые две цифры (482) означают страну происхождения (изготовителя или продавца) продукта, следующие 4 или 5 в зависимости от длинны кода страны (0024) — предприятие-изготовитель, еще пять (70001) — наименование товара, его потребительские свойства, размеры, массу, цвет. Последняя цифра (6) контрольная, используемая для проверки правильности считывания штрихов сканером. EAN — 13:

Для кода товара:
1 цифра: наименование товара,
2 цифра: потребительские свойства,
3 цифра: размеры, масса,
4 цифра: ингредиенты,
5 цифра: цвет.

.

Пример вычисления контрольной цифры для определения подлинности товара

1. Сложить цифры, стоящие на четных местах:
8+0+2+7+0+1=18

2. Полученную сумму умножить на 3:
18×3=54

3. Сложить цифры, стоящие на нечетных местах, без контрольной цифры:
4+2+0+4+0+0=10

4. Сложить числа, указанные в пунктах 2 и 3:
54+10=64

5. Отбросить десятки:
получим 4

6. Из 10 вычесть полученное в пункте 5:
10-4=6

Если полученная после расчета цифра не совпадает с контрольной цифрой в штрих-коде, это значит, что товар произведен незаконно.

Для кода страны-изготовителя отводится два или три знака, а для кода предприятия — четыре или пять. Товары, имеющие большие размеры, могут иметь короткий код, состоящий из восьми цифр — EAN-8.

.

Как правило, код страны присваивается Международной ассоциацией EAN. Обращаем внимание потребителей на то, что код странны никогда не состоит из одной цифры.

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

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

Вторая: товар был изготовлен на дочернем предприятии.

Третья: возможно, товар был изготовлен в одной стране, но по лицензии фирмы из другой страны.

Четвертая — когда учредителями предприятия становятся несколько фирм из различных государств.

Таблица соответствия штрихкодов стран в системе «EAN»

СтранаШтрихкод
Канада00-09
США00-09
Франция30-37
Япония49
Великобритания50
Бельгия54
Люксембург54
Финляндия64
Норвегия70
Швеция73
Швейцария76
Италия80-83
Испания84
Нидерланды87
Австрия90-91
Австралия93
Новая Зеландия94
Болгария380
Словения383
Хорватия385
Германия400-440
Россия460
Тайвань471
Эстония474
Латвия475
Литва477
Шри-Ланка479
Филиппины480
Украина482
Молдова484
Гваделупа489
Греция520
Кипр529
Мальта535
Ирландия539
Португалия560
Исландия569
Польша590
Румыния594
Венгрия599
Южно-Африканская Республика600-601
Мавритания609
Марокко и Западная Сахара611
Тунис619
Босния687
Китай690-691
Израиль729
Гватемала740-745
Гондурас740-745
Коста-Рика740-745
Никарагуа740-745
Панама740-745
Сальвадор740-745
Доминиканская республика746
Мексика750
Венесуэла759
Колумбия770
Уругвай773
Перу775
Боливия777
Аргентина779
Чили780
Парагвай784
Эквадор786
Бразилия789
Куба850
Словакия858
Чехия859
Сербия860
Турция869
Южная Корея880
Таиланд885
Сингапур888
Индия890
Вьетнам893
Индонезия899
Малайзия955

Теги: штрих код, штрих кода, штрихкод, коды штрих кодов, штрихкоды, штрих коды страны, штрих коды стран, штрих коды государств, страна по штрих коду, расшифровка штрих кода, штрих коды производителей, штрих коды изготовителей, штрих код страна производитель, штрих код расшифровка, штриховой код, чтение штрих кода, штрих код товара, штрих коды товаров, страна производитель по штрих коду, картинка штрих кода, чтение штрих кодов, страна изготовитель по штрих коду, штрих код Украина, таблица штрих кодов, штрих код изготовителя, значение штрих кода, фото штрих кода, узнать производителя по штрих коду, определить страну по штрих коду, что означает штрих код, штрих код России, штрих код Франции, штрих код Италии, штрих код Китая, таблица штрих кодов стран, обозначение штрих кода, определение товара по штрих коду, как узнать страну по штрих коду, справочник штрих кодов

Источник

Привет, Хабр!

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

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

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

Введение

Использование штрихкодов имеет давнюю историю. Первые попытки автоматизации начинались еще в 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» по тому же самому принципу. Желающие могут сравнить стартовый код на картинке, чтобы убедиться что правило выполняется.

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

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

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

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

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

image_path = “barcode.jpg”
img = Image.open(image_path)
width, height = img.size
basewidth = 4*width
img = img.resize((basewidth, height), Image.ANTIALIAS)
hor_line_bw = img.crop((0, int(height/2), basewidth, int(height/2) + 1)).convert(‘L’)
hor_data = np.asarray(hor_line_bw, dtype=”int32″)[0]

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

hor_data = 255 – hor_data
avg = np.average(hor_data)

plt.plot(hor_data)
plt.show()

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

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

pos1, pos2 = -1, -1
bits = “”
for p in range(basewidth – 2):
if hor_data[p] < avg and hor_data[p + 1] > avg:
bits += “1”
if pos1 == -1:
pos1 = p
if bits == “101”:
pos2 = p
break
if hor_data[p] > avg and hor_data[p + 1] < avg:
bits += “0”

bit_width = int((pos2 – pos1)/3)

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

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

bits = “”
for p in range(basewidth – 2):
if hor_data[p] > avg and hor_data[p + 1] < avg:
interval = p – pos1
cnt = interval/bit_width
bits += “1”*int(round(cnt))
pos1 = p
if hor_data[p] < avg and hor_data[p + 1] > avg:
interval = p – pos1
cnt = interval/bit_width
bits += “0”*int(round(cnt))
pos1 = p

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

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

11010010000110001010001000110100010001101110100011011101000111011011
01100110011000101000101000110001000101100011000101110110011011001111
00010101100011101011

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

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

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

CODE128_CHART = “””
0 _ _ 00 32 S 11011001100 212222
1 ! ! 01 33 ! 11001101100 222122
2 ” ” 02 34 ” 11001100110 222221
3 # # 03 35 # 10010011000 121223

93 GS } 93 125 } 10100011110 111341
94 RS ~ 94 126 ~ 10001011110 131141
103 Start Start A 208 SCA 11010000100 211412
104 Start Start B 209 SCB 11010010000 211214
105 Start Start C 210 SCC 11010011100 211232
106 Stop Stop – – – 11000111010 233111″””.split()
SYMBOLS = [value for value in CODE128_CHART[6::8]]
VALUESB = [value for value in CODE128_CHART[2::8]]
CODE128B = dict(zip(SYMBOLS, VALUESB))

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

sym_len = 11
symbols = [bits[i:i+sym_len] for i in range(0, len(bits), sym_len)]

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

str_out = “”
for sym in symbols:
if CODE128A[sym] == ‘Start’:
continue
if CODE128A[sym] == ‘Stop’:
break
str_out += CODE128A[sym]
print(” “, sym, CODE128A[sym])

print(“Str:”, str_out)

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

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

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

from pyzbar.pyzbar import decode

img = Image.open(image_path)
decode = decode(img)
print(decode)

(предварительно нужно установить библиотеку, введя команду «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-коды.

Спасибо за внимание.

Источник