пятница, 2 июля 2010 г.

Контроль правильности Штрих-кода (EAN-13, UPC-12, EAN-8 - barcode)

Где только не видно штрих-кодов. Многое, что нас окружает было когда-то произведено людьми и предназначалось для продажи, то есть кругом товары, а их надо учитывать и контролировать их движение. Для контроля надо уметь идентифицировать товары, да ещё и в удобном для считывания и обработки виде, и надо уметь проверять достоверность этих кодов.
Few programming (C):


1 /**@file isBarCode.c
2 rus: Контроль правильности Штрих-кода (Бар-кода)
3 eng: Control of the correctness of the barcode
4
5 |k13|k12|k11|k10|k9 |k8 |k7 |k6 |k5 |k4 |k3 |k2 |k1
6 =======+===+===+===+===+===+===+===+===+===+===+===+===+===
7 EAN-13 | 1 3 1 3 1 3 1 3 1 3 1 3 1
8 UPC-12 | 3 1 3 1 3 1 3 1 3 1 3 1
9 EAN-8 | 3 1 3 1 3 1 3 1
10
11 Контрольная сумма есть остаток от деления на 10 суммы из цифр номера,
12 умноженных на соответствующие коэффициенты из таблицы.
13 Если контрольная сумма есть 0, то номер признаётся правильным.
14
15 Если нужно подсчитать требуемое контрольное число для произвольного
16 номера, нужно вначале поставить «0» на крайнюю правую позицию,
17 посчитать контрольную сумму, а затем,
18 если она не равна нулю, заменить этот «0» на «10 — контрольная сумма».
19 */

20
21 #include <stdio.h>
22 #include <stdlib.h>
23
24 int is_bar_code(int cntSimbols,char* kod) {
25 //Массив коэффициентов
26 char k[]= {1,3,1,3,1,3,1,3,1,3,1,3,1};
27 int i,j,sumV=0;
28
29 if(cntSimbols==8 || cntSimbols==12 || cntSimbols==13) {
30 for(i=0,j=13-cntSimbols; i<cntSimbols; i++,j++) {
31 //Коды символов чисел отличаются на 48, типа 48='0',49='1', ...,
32 printf("%d\t%d\t%d\n",kod[i]-48,k[j],(kod[i]-48)*k[j]);
33 sumV=sumV+(kod[i]-48)*k[j];
34 }
35 return sumV%10?0:1;
36 } else {
37 return 0;
38 }
39 }
40
41 int main(int argc , char* argv[]) {
42
43 if(argc!=3) {
44 printf("Wrong number of arguments!!! \n\nThe first argument in the
» command line - \ncode for verification, type 46009333, 041689300494,
» 4600051000057\n\nThe second argument on the command line - \nthe number of
» characters in the code (8,12,13) \n\n Example:\n isBarCode.exe 46009333 8\n\n"
);
45 exit(1);
46 }
47
48 {
49 //Первый аргумент в командной строке - код для проверки, типа 46009333,
» 041689300494,4600051000057

50 char* val=argv[1];
51 int cnt=atoi(argv[2]);
52 //Второй аргумент в командной строке - число символов в коде (8,12,13)
53 printf("%s\n",is_bar_code(cnt,val)?"OK":"BAD");
54 }
55 return 0;
56 }

Комментариев нет:

Отправить комментарий