Комментарии 22
Со штрихкодами современный человек сталкивается каждый деньи давай рассматривать Code-128. Хотя, каждый день мы сталкиваемся с EAN-13.
Если уж хочется рассмотреть code-128, то стоит рассказать про gs1-128. Как по мне, это именно те штрих-коды, которые должны любить программисты — в них предусмотрена запись уникального идентификатора каждой единицы залепленой штрих-кодом штуки. А уникальные идентификаторы — это ордрунг, к которому мы стремимся.
+6
Да, в gs1-128 интересное кодирование, но уж больно много полей там, для общего ознакомления черезчур избыточно.
0
Необязательно рассматривать назначение всех полей. Объяснить правила построения, отметить, что частью является EAN-13, рассказать про основные области применения, упомянуть совместимость с другими стандартами.
По факту, GS1-128 выполняет две функции.
1. Позволяет закодировать в штрих-код значимую информацию, а не просто какой-то идентификатор. Нужно это для того, чтобы без доступа к хранилищу данных, получить информацию о грузе/товаре. Например, срок годности или размеры.
2. Расширяет EAN-13, который содержит идентификатор номенклатурной позиции, возможностью идентифицировать конкретные экземпляры. Это важно для поштучного учёта. Например, для электроники — иметь уникальный идентификатор, по которому можно вытянуть из системы управления производством спецификацию, по которой собрано, включая все возможные замены, кто конкретно отвечал за сборку каждого компонента и т.п. Вплоть до того, что можно поднять записи с видеокамеры в момент сборки конкретной части и понять, что послужило причиной возникновения брака.
По факту, GS1-128 выполняет две функции.
1. Позволяет закодировать в штрих-код значимую информацию, а не просто какой-то идентификатор. Нужно это для того, чтобы без доступа к хранилищу данных, получить информацию о грузе/товаре. Например, срок годности или размеры.
2. Расширяет EAN-13, который содержит идентификатор номенклатурной позиции, возможностью идентифицировать конкретные экземпляры. Это важно для поштучного учёта. Например, для электроники — иметь уникальный идентификатор, по которому можно вытянуть из системы управления производством спецификацию, по которой собрано, включая все возможные замены, кто конкретно отвечал за сборку каждого компонента и т.п. Вплоть до того, что можно поднять записи с видеокамеры в момент сборки конкретной части и понять, что послужило причиной возникновения брака.
+2
+3
Для ЛЛ, в штрих коде закодировано «Wikipedia»
0
Про штрихкоды хорошо написано в книге Чарльза Петцольда «Код. Тайный язык информатики»
0
текст под штрихкодом (если он есть) полностью дублирует его содержание.
Попробуйте отсканировать Code 39 ШК внизу чека из Ленты, Окея или Призмы и убедитесь, что это не совсем так :-)
0
А что печатают в Ленте? Или может заморочки с кириллицей/кодировками какие-нибудь?
Судя по онлайн-генератору, для Code 39 текст должен совпадать.
Судя по онлайн-генератору, для Code 39 текст должен совпадать.
Пример
0
Пример
Когда-то в ШК было закодировано ровно то, что написано под ним — код-идентификатор чека (009.0256.061217.007
).
Но такой ШК в Code 39 не помещался на чековую ленту 57 мм, поэтому формат кода-идентификатора изменился на более емкий, содержащий все те же данные, но в более компактном виде (05CB1AP.0JZARH
).
Для совместимости с человеком и цифровыми клавиатурами расшифровка ШК осталась прежней.
+3
Кстати, была интересная статья(тоже на Питоне) о том, как выделить с фото штрих-код habr.com/ru/company/enterra/blog/244163. В совокупности, с описанным в нынешней статье кодом, можно сделать полноценное преобразование из реальных условий)
0
Да, можно через OpenCV выделять замкнутые области на изображении, потом на них искать баркод.
Для чтения штрихкодов есть уже готовая библиотека pyzbar для Python, ее просто использовать: pypi.org/project/pyzbar
Для чтения штрихкодов есть уже готовая библиотека pyzbar для Python, ее просто использовать: pypi.org/project/pyzbar
0
Если структура штрих кода фиксирована, значит под каждую его часть(Стартовый символ, код, хеш, стоп-символ) выделено фиксированное количество бит. Собственно сколько бит информации можно записать?
0
11 бит на символ, а дальше сколько угодно, просто код длиннее будет
(наверно есть какие-то ограничения у самих ридеров, не знаю, метровых кодов ни разу не видел)
(наверно есть какие-то ограничения у самих ридеров, не знаю, метровых кодов ни разу не видел)
+1
Поскольку штрих-коды — это промышленный стандарт, то и ограничения ридеров тоже стандартизованы: до 48 символов либо до 6½ дюймов длины для GS1-128.
+1
Интересна история контрольной цифры. Она возникла эволюционно.
Контрольная цифра нужна для того, чтобы избежать неправильного декодирования. Если штрихкод был 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.
Контрольная цифра нужна для того, чтобы избежать неправильного декодирования. Если штрихкод был 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.
+5
Да, конечно, только пара дополнений:
1) «Код 1217 — тоже валидный, а вот 1218 — нет.» — чуть поторопился. Правильно «Код 1216 — тоже валидный, а вот 1218 — нет.»
2) Описанный способ стал стандартом вычисления контрольной суммы EAN13 за небольшими правками: число цифр стало фиксированным и равно 13, где 13-ая — это та самая контрольная цифры. Цифры на нечетных местах считаются трижды, на четных — один раз.
1) «Код 1217 — тоже валидный, а вот 1218 — нет.» — чуть поторопился. Правильно «Код 1216 — тоже валидный, а вот 1218 — нет.»
2) Описанный способ стал стандартом вычисления контрольной суммы EAN13 за небольшими правками: число цифр стало фиксированным и равно 13, где 13-ая — это та самая контрольная цифры. Цифры на нечетных местах считаются трижды, на четных — один раз.
0
В какой позиции стоит контрольная цифра в номере банковского счета (р/с, к/с)?
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Как устроен штрихкод?