Как стать автором
Обновить

Комментарии 22

Со штрихкодами современный человек сталкивается каждый день
и давай рассматривать Code-128. Хотя, каждый день мы сталкиваемся с EAN-13.
Если уж хочется рассмотреть code-128, то стоит рассказать про gs1-128. Как по мне, это именно те штрих-коды, которые должны любить программисты — в них предусмотрена запись уникального идентификатора каждой единицы залепленой штрих-кодом штуки. А уникальные идентификаторы — это ордрунг, к которому мы стремимся.
Да, в gs1-128 интересное кодирование, но уж больно много полей там, для общего ознакомления черезчур избыточно.
Необязательно рассматривать назначение всех полей. Объяснить правила построения, отметить, что частью является EAN-13, рассказать про основные области применения, упомянуть совместимость с другими стандартами.
По факту, GS1-128 выполняет две функции.
1. Позволяет закодировать в штрих-код значимую информацию, а не просто какой-то идентификатор. Нужно это для того, чтобы без доступа к хранилищу данных, получить информацию о грузе/товаре. Например, срок годности или размеры.
2. Расширяет EAN-13, который содержит идентификатор номенклатурной позиции, возможностью идентифицировать конкретные экземпляры. Это важно для поштучного учёта. Например, для электроники — иметь уникальный идентификатор, по которому можно вытянуть из системы управления производством спецификацию, по которой собрано, включая все возможные замены, кто конкретно отвечал за сборку каждого компонента и т.п. Вплоть до того, что можно поднять записи с видеокамеры в момент сборки конкретной части и понять, что послужило причиной возникновения брака.
Для ЛЛ, в штрих коде закодировано «Wikipedia»
В заголовке другой штрихкод, хотя этот ответ тоже правильный ;)
В заголовке «HELLO HABR!» :)
Про штрихкоды хорошо написано в книге Чарльза Петцольда «Код. Тайный язык информатики»
текст под штрихкодом (если он есть) полностью дублирует его содержание.

Попробуйте отсканировать Code 39 ШК внизу чека из Ленты, Окея или Призмы и убедитесь, что это не совсем так :-)

А что печатают в Ленте? Или может заморочки с кириллицей/кодировками какие-нибудь?

Судя по онлайн-генератору, для Code 39 текст должен совпадать.
Пример

Пример


Когда-то в ШК было закодировано ровно то, что написано под ним — код-идентификатор чека (009.0256.061217.007).


Но такой ШК в Code 39 не помещался на чековую ленту 57 мм, поэтому формат кода-идентификатора изменился на более емкий, содержащий все те же данные, но в более компактном виде (05CB1AP.0JZARH).


Для совместимости с человеком и цифровыми клавиатурами расшифровка ШК осталась прежней.

Кстати, была интересная статья(тоже на Питоне) о том, как выделить с фото штрих-код habr.com/ru/company/enterra/blog/244163. В совокупности, с описанным в нынешней статье кодом, можно сделать полноценное преобразование из реальных условий)
Да, можно через OpenCV выделять замкнутые области на изображении, потом на них искать баркод.

Для чтения штрихкодов есть уже готовая библиотека pyzbar для Python, ее просто использовать: pypi.org/project/pyzbar
Если структура штрих кода фиксирована, значит под каждую его часть(Стартовый символ, код, хеш, стоп-символ) выделено фиксированное количество бит. Собственно сколько бит информации можно записать?
11 бит на символ, а дальше сколько угодно, просто код длиннее будет
(наверно есть какие-то ограничения у самих ридеров, не знаю, метровых кодов ни разу не видел)
Интересна история контрольной цифры. Она возникла эволюционно.
Контрольная цифра нужна для того, чтобы избежать неправильного декодирования. Если штрихкод был 1234, а его распознали как 7234, то нужна валидация, которая предупредит замену 1 на 7. Валидация может быть неточная, чтобы хотя бы в 90% невалидные номера определялись заранее.

1-й подход: Давайте просто возьмем сумму. Чтобы в остатке от деления на 10 был 0. Ну то есть первые 12 символов несут информационную нагрузку, а последняя цифры подбирается так, чтобы сумма цифр делилась на 10. Декодируем последовательность, если сумма не делится на десять — значит декодировали с багом и нужно сделать это еще раз. Например, код 1234 — валидный. 1+2+3+4 = 10. Код 1217 — тоже валидный, а вот 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.
Спасибо, интересно. Если вы не против, могу добавить ваш комментарий к статье (с указанием источника разумеется;).
Да, конечно, только пара дополнений:

1) «Код 1217 — тоже валидный, а вот 1218 — нет.» — чуть поторопился. Правильно «Код 1216 — тоже валидный, а вот 1218 — нет.»
2) Описанный способ стал стандартом вычисления контрольной суммы EAN13 за небольшими правками: число цифр стало фиксированным и равно 13, где 13-ая — это та самая контрольная цифры. Цифры на нечетных местах считаются трижды, на четных — один раз.
Спасибо, добавил ваше описание в текст.
Цифра после ОКВ (пример расчёта в письме утв. Банком России 08.09.1997 N 515).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории