left even = (left data - 0) mod 28 = 4904 mod 28 = 4;

значение правого знака символа (right data), равное 1991026, находится в группе 6 с 19 нечетными и 7 четными модулями29), таким образом:

значение нечетного поднабора элементов правого знака символа:

right odd = (right data - 1979845) div 1 =11181 div 1 =11181;

значение четного поднабора элементов правого знака символа:

right even = (right data - 1979845) mod 1 = 11181 mod 1 = 0;

  1. применяя алгоритм кодирования ширины элементов для поднаборов символа GS1 DataBar (приложе­ние В), получают следующие размеры ширины элементов (в модулях) из значений поднаборов:

для поднабора нечетных элементов левого знака символа:

left odd (для значения 175) = 1 1 2 2 2 4 5;

для поднабора четных элементов левого знака символа:

left even (для значения 4) = 11112 2 1.

Таким образом, ширина элементов левого знака символа равна 1 1 1 12121224251;

для поднабора нечетных элементов правого знака символа:

right odd (для значения 11181) = 331 352 2;

для поднабора четных элементов правого знака символа:

right even (для значения 0) = 1111111.

Таким образом, ширина элементов правого знака символа равна 31311131512121;

  1. вычисляют контрольную сумму30);

значение для левого знака символа:

left = 1x1 + 1x3+ 1x9 + 1x27 + 2x81 + 1x65 + 2x17+ 1x51 + 2x64 + 2x14 +

+ 4x42 +2x37 + 5x22 + 1 хбб = 926;

значение правого знака символа:

right = 3x20 + 1x60 + 3x2 + 1x6+ 1x18 + 1x54 + 3x73 + 1x41 +

+ 5x34 + 1x13 + 2x39 + 1x28 + 2x84+ 1x74 = 995.

Следовательно, контрольная сумма = (926 + 995) mod 89 = 52;

  1. вычисляют ширину элементов (в модулях) контрольного знака (приложение В) для значения 52 = 1 1 1 2 1 1 2 1 1 22 1 1 1;

д) устанавливают ширину всех элементов символа (левый шаблон-ограничитель, левый знак символа, кон­трольный знак, правый знак символа и правый шаблон-ограничитель):

11,11112121224251,11121121122111,31311131512121,11 5.

F.3 Пример кодирования данных в символе GS1 DataBar Расширенный

В символе GS1 DataBar Расширенный (рисунок F.3) закодирована строка элемента с идентификато­ром применения (10)12А. Данные в настоящем примере не содержат основную идентификацию предмета и являются условными.

Рисунок F.3 — Пример символа GS1 DataBar Расширенный

Этапы вычисления ширины элементов символа GS1 DataBar Расширенный:

  1. определяют значение, подлежащее кодированию в символе 1012А;

  2. устанавливают значения в двоичных полях:

бит флага сопровождения31) = 0 (отсутствует двумерный компонент);

значение метода кодирования32) = 00 (отсутствует особое уплотнение AI, но некоторые AI могут быть закодированы по знакам);

биты в поле символа переменной

длины33) = 00 (четное число знаков символа; число знаков символа менее или

равно 14);

биты данных34); = 0010011 (схема числового кодирования для пары цифр «10»);

= 0010101 (схема числового кодирования для пары цифр «12»);

= 0000 (указатель фиксации схемы алфавитно-цифрового кодирова­ния):

= 100000 (схема алфавитно-цифрового кодирования для знака «А»);

= 0010000 (для заполнения поля).

Таким образом, строкой данных является последовательность 000000010011001010100001000000010000;

Примечание — В данном примере описан метод кодирования, приведенный в 7.2.5.

  1. строку данных разбивают на группы по 12 битов каждая: 000000010011, 001010100001 и 000000010000. Определяют значения трех знаков символа:

data 1 = 000000010011 = 19;

data 2 = 001010100001 = 673;

data 3 = 000000010000 = 16;

  1. рассчитывают значения нечетного и четного поднаборов данных для трех знаков символа1);

значение первого знака символа (data 1)19 находится в группе 1 с 12 нечетными и 5 четными модулями, следовательно:

значение нечетного поднабора элементов:

odd 1 = (data 1 - 0) div 4 = 19 div 4 = 4;

значение четного поднабора элементов:

even 1 = (data 1 - 0) mod 4 = 19 mod 4 = 3;

значение второго знака символа (data 2) 673 находится в группе 2 с 10 нечетными и 7 четными модулями, следовательно:

значение нечетного поднабора элементов:

odd 2 = (data 2 - 348) div 20 = 325 div 20 = 16;

значение четного поднабора элементов:

even 2 = (data 2 - 348) mod 20 = 325 mod 20 = 5;

значение третьего знака символа (data 3) 16 находится в группе 1 с 12 нечетными 5 четными модулями, следовательно

значение нечетного поднабора элементов:

odd 3 = (data 3-0) div 4 = 16 div 4 = 4;

значение четного поднабора элементов:

even 3 = (data 3-0) mod 4 = 16 mod 4 = 0;

  1. применяя алгоритм кодирования ширины элементов для поднаборов символа GS1 DataBar (приложе­ние В), получают следующие размеры ширины элементов из значений поднаборов:

для под набора нечетных элементов 1-го знака символа:

odd 1 (для значения 4) = 117 3;

для под набора четных элементов 1-го знака символа:

even 1 (для значения 3) = 2 1 1 1.

Таким образом, ширина элементов первого знака символа (в модулях) равна 12117131 (зеркаль­ное отображение слева направо);

для поднабора нечетных элементов 2-го знака символа:

odd 2 (для значения 16) = 1 5 1 3;

для поднабора четных элементов 2-го знака символа:

even 2 (для значения 5) = 1 2 2 2.

Таким образом, ширина элементов второго знака символа (в модулях) равна 1 1 52123 2;

для поднабора нечетных элементов 3-го знака символа:

odd 3 (для значения 4) = 117 3;

для поднабора четных элементов 3-го знака символа:

even 3 (для значения 0) = 1112.

Таким образом, ширина элементов третьего знака символа (в модулях) равна 11117 13 2 (зеркаль­ное отображение слева направо);

  1. вычисляют контрольную сумму35 >:

значение для первого знака символа:

data 1 = 1x1 + 2x3 + 1x9 + 1x27 + 7x81 + 1x32 + 3x96 + 1x77 = 1007;

значение для второго знака символа:

data 2 = 1x20 + 1x60 + 5x180 + 1x118 + 1x143 + 2x7 + 3x21 + 2x63 = 1562;

значение для третьего знака символа:

data 3 = 1x189 + 1x145 + 1x13 + 1x39 + 7x117 + 1x140 + 3x209 + 2x205 = 2382.

Значение контрольной суммы = (1007 + 1562 + 2382) mod 211 = 98;

  1. вычисляют значение контрольного знака символа36^: 211(4 -4) + 98 = 98.

Значения нечетного и четного поднаборов для контрольного знака символа37);

Значение контрольного знака, равное 98, находится в группе 1 с 12 нечетными и 5 четными модулями, таким образом:

значение нечетного поднабора элементов:

odd с = (значение контрольного знака) div 4 = 98 div 4 = 24;

значение четного поднабора элементов:

even с = (значение контрольного знака) mod 4 = 98 mod 4 = 2.

Используя алгоритм расчета ширины элементов в поднаборах для символа GS1 DataBar Расширенный (приложение В), получают следующие размеры ширины элементов (в модулях):

в нечетном поднаборе odd с (для значения 24) = 15 15;

в четном поднаборе even с (для значения 2) = 1 2 1 1.

Таким образом, ширина элементов контрольного знака, в модулях равна 115 2 115 1;

  1. устанавливают ширину всех элементов символа (левый шаблон-ограничитель, контрольный знак, шаблон поиска А1, первый знак символа (со значением data 1) (зеркальное отображение), второй знак символа (со значением data 2), шаблон поиска А2, третий знак символа (со значением data 3) (зеркальное отображение) и правый шаблон-ограничитель):

1 1,1 1521 151,1841 1,13171 121,1 152123 2, 1 1481,23171 1 1 1,1 1.

Приложение G
(справочное)

Программа декодирования ширины элемента на языке
программирования С

#include <stdio.h>

  • Две подпрограммы -- elements() и elementsExp() --

  • входные данные:

  • eDistf] = первые нормированные (2*К)-2 значения «от края до подобного края»

  • (всегда начиная с внешнего шаблона поиска!!) и

  • N и К, определяющие структуру знака,

  • выходные данные:

  • widths [] = 2*К размеры ширины элементов.

*

  • Для символов GS1 DataBar Всенаправленный, GS1 DataBar Усеченный, GS1 DataBar Двустрочный или GS1 DataBar Двустрочный Всенаправленный вызов:

  • elements (*eDist,*widths,15,4) внутренних знаков символа &

  • elements (*eDist,*widths,16,4) для внешних знаков символа.

  • Для GS1 DataBar Ограниченный вызов elements (*eDist,*widths,26,7). *

  • Для GS1 DataBar Расширенный вызов elementsExp(*eDist,*widths,17,4). *

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

  • подпрограмма elements() определяет ширину элементов знака (n,k) при по крайней мере одном

  • элементе с четным номером шириной ровно один модуль.

  • (Примечание — Элементы с четными номерами — 2-й, 4-й, 6-й и т.д. имеют нечетные индексы).

void elements (int *eDist, int *widths, int N, int K) {

int i;

int minEven;

int barSum;

/* получение размеров ширины элементов из нормированных измерений «от края до подобного края»*/

minEven = 10; /* начинают с завышенного наименьшего значения */

barSum = widths [0] = 1; /* сначала предполагают, что ширина первого штриха равна 1 модулю*/

for (і = 1; і < К*2-2; і += 2) {

widths[i] = eDist[i-1] - widths[i-1];

widths[i+1 ] = eDist[i] - widthsfi];

barSum += widths[i] + widths[i+1 ];

if (widths[i] < minEven) minEven = widths[i];

widths[K*2-1] = N - barSum; /* ширина последнего четного элемента составляет N модулей */

if (widths[K*2-1 ] < minEven) minEven = widths[K*2-1];

if (minEven > 1) {

/* минимальная четная ширина четного элемента слишком большая, следует откорректировать ее на 1 */ for (і = 0; і < К*2; і += 2) {

widths[i] += minEven-1;

widths[i+1] -= minEven-1;

return;★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

  • подпрограмма elementsExp() определяет ширину элементов знака (n,k)

  • при по крайней мере одном элементе с нечетным номером шириной ровно один модуль

  • (Примечание — Элементы с нечетными номерами — 1-й, 3-й, 5-й и тд. имеют четные индексы)

void elementsExp (int *eDist, int *widths, int N, int K) {

int i;

int minOdd;

int barSum;

/* получение размеров ширины элементов из нормированных измерений «от края до подобного края»*/

minOdd = 8; /* начинают с минимума == предполагаемая ширина первого элемента */

barSum = widths[0] = 8; /* сначала предполагают, что ширина первого штриха максимальная/8 модулей */

for (і = 1; і < К*2-2; і += 2) {

widths[i] = eDist[i-1 ] - widths[i-1 ];

widths[i+1 ] = eDist[i] - widths[i];

barSum += widths[i] + widths[i+1 ];

if (widths[i+1] < minOdd) minOdd = widths[i+1 ];

widths[K*2-1] = N - barSum; /* последний четный элемент составляет N модулей */

if (minOdd > 1) {

/* минимальная ширина нечетных элементов слишком велика, следует уточнить, чтобы минимальная ширина нечетных элементов составляла 1 */

for (і = 0; і < К*2; і += 2) {

widths[i] -= minOdd-1;

widths[i+1] += minOdd-1;

return;

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

  • пример () демонстрирует подпрограммы «elements» для GS1 DataBar Всенаправленный, GS1 DataBar Усечен­ный, GS1 DataBar Двустрочный, GS1 DataBar Двустрочный Всенаправленный, GS1 DataBar Ограниченный и GS1 DataBar Расширенный.

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★I

void main (void) {

int eDist14[6] = { 5,3,3,3,4,5 };

int eDistLim[12] = { 2,3,4,3,4,4,6,6,2,2,3,4 };

int eDistExp[6] = { 2,3,3,3,3,3 };

int widths[14];

int i;

/* для внешнего знака символа символов штрихового кода GS1 DataBar Всенаправленный, GS1

DataBarУсеченный, GS1 DataBarДвустрочный или GS1 DataBar Двустрочный Всенаправленный г*/ elements(eDist14, widths, 16,4);

printf("n GS1 DataBar (16,4) elements: "); for (і = 0; і < 8; i++) printf("%d ", widths[i]);

/* для внутреннего знака символа символов штрихового кода GS1 DataBar Всенаправленный, GS1

DataBarУсеченный, GS1 DataBarДвустрочный или GS1 DataBar Двустрочный Всенаправленный г*/ elements(eDist14, widths, 15,4); printf("n GS1 DataBar (15,4) elements: ");

for (і = 0; і < 8; i++) printf("%d ", widths[i]);

/* для GS1 DataBar Ограниченный */ elements(eDistl_im, widths, 26,7); printf("n GS1 DataBar Limited elements: "); for (і = 0; і < 14; i++) printf("%d ", widths[i]);

/* для GS1 DataBar Расширенный */ elementsExp(eDistExp, widths, 17,4); printf("n GS1 DataBar Expanded elements: "); for (і = 0; і < 8; i++) printf("%d ", widths[i]);

printf("n");

return;

Приложение H
(справочное)

Рекомендации по минимизации ошибок при считывании

Н.1 Основные положения

Все версии символов GS1 DataBar (кроме GS1 DataBar Ограниченный) разработаны для обеспечения возможности сканирования по сегментам, каждый из которых содержит шаблон поиска и смежный знак символа. Некоторые сканеры могут требовать декодирования отдельных сегментов для обеспечения эффективного все­направленного сканирования. Для таких сканеров важно свести к минимуму возможность возможность ошибоч­ного считывания ненадлежащего сегмента (например, обнаруженного в графическом изображении или в несоот­ветствующей месте в пределах символа).

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

На рисунке Н.1 приведен пример двух необнаруженных ошибок смещения края в символе GS1 DataBar Всенаправленный. Верхний символ — первоначальный символ, который был сканирован, и нижний символ — реконструированный на основе данных, декодированных в результате ошибочного считывания верхне­го символа.

0100614141001682



0100614166026677

Рисунок Н.1—Два действительных символа GS1 DataBar Всенаправленный,
отличающиеся только двумя смещенными краями внутри одного знака символа

Указанные особенности символики GS1 DataBar требуют введения допонительных мер повышения надежности, связанных с необходмостью сбора избыточных данных. Рекомендуется использовать нижеуказан­ные алгоритмы, хотя приемлемы и иные алгоритмы, которые обеспечивают подобный уровень надежности.

Н.2 Декодирование с подсчетом

  1. Схема алгоритма декодирования с подсчетом

При обработке каждой линии сканирования подсчитывают число случаев декодирования какого-либо значения-кандидата в каждой позиции сегмента (или символа GS1 DataBar Ограниченный в целом). Для каж­дой позиции сегмента ведут отдельные списки значений-кандидатов (до 24 для GS1 DataBar Расширенный, один для GS1 DataBar Ограниченный и четыре для всех других).