條形碼就是我們看到的商品上有的那些豎條條。
要不是項目上用到這個或許我一輩子也不會對那個感興趣。
條形碼其實是分成很多類的,雖然他們看起來都差不多……
常見的條形碼的碼制被稱為39碼、128碼、417碼等等。
我今天主要講的是128碼即CODE128。
Code128碼其實還分成三類,即128A、128B、128C。它們的區別就是對應的字符表不一樣。
那么Code128碼到底怎么讀呢?請看下面的圖:
從左往右是黑白相間的條形碼,黑的叫“條”(B),白的叫“空”(S)。
如果你仔細看,條和空都有4種不同的寬度。我們將它從細到粗賦予1、2、3、4這幾個值。
然后我們開始按照粗細的值來閱讀條碼、結果如下:
211232231131221213131222212222221224121213121211321132331112
注意這個結果是黑白相間的。別只顧着讀“條”忘了都空。這邊總共有61位。
Code128碼有一個頭一個尾。
尾總是2331112,這代表Code128已經結束。其余的部分是6位為一個塊,包括頭。
頭有3種:A)211412 B)211214 C)211232 。這分別表示此Code128是什么類型的。(ABC其中一種)
我們將我們讀出來的碼,去掉頭和尾,重新分一次塊:
231131 | 221213 | 131222 | 212222 | 221224 | 121213 | 121211 | 32113
正好是6位為一塊。其中最后一個塊(除去尾段)是校驗位,用於檢查該條形碼是否被正確編碼。
然后,我們有一個字符表。(應該說是我有這張表)這張字符對應各個編號是表示的什么。
我們這個是Code128C型。C型碼是純數字的,每個塊對應2位數字。
查表可得 50 09 05 00 01 91 91 。
有了這些知識,我們就可以嘗試去寫一個程序去生成條形碼和識別條形碼。
其實生成是比較簡單的,而識別就比較麻煩了。通常超市是使用條碼槍,通過光學原理來識別的,因為黑白條紋的反光特性不一樣。
要是用軟件對圖像進行識別,會有些麻煩。但是,這正是我們要做的。
附:
Code128 字符表:
可以看出從0-63這前64個字符中A類和B類是一樣的。
其中有些控制字符,比如CodeA表示此字段下一個個塊臨時使用Code128A的字符表中的字符。
還有一些其他的,不是很常見,有興趣的朋友可以參考GBT 15425-2002 EAN UCC系統 128條碼 標准。
注:ABC分別為128A類,128B類,128C類的字符表。有些B類的字符為空表示和A類的一樣。
B,S,B,S,B,S// A B C
2,1,2,2,2,2,// sp 00
2,2,2,1,2,2,// ! 01
2,2,2,2,2,1,// " 02
1,2,1,2,2,3,// # 03
1,2,1,3,2,2,// $ 04
1,3,1,2,2,2,// % 05
1,2,2,2,1,3,// & 06
1,2,2,3,1,2,// ... 07
1,3,2,2,1,2,// ( 08
2,2,1,2,1,3,// ) 09
2,2,1,3,1,2,// * 10
2,3,1,2,1,2,// + 11
1,1,2,2,3,2,// , 12
1,2,2,1,3,2,// - 13
1,2,2,2,3,1,// . 14
1,1,3,2,2,2,// / 15
1,2,3,1,2,2,// 0 16
1,2,3,2,2,1,// 1 17
2,2,3,2,1,1,// 2 18
2,2,1,1,3,2,// 3 19
2,2,1,2,3,1,// 4 20
2,1,3,2,1,2,// 5 21
2,2,3,1,1,2,// 6 22
3,1,2,1,3,1,// 7 23
3,1,1,2,2,2,// 8 24
3,2,1,1,2,2,// 9 25
3,2,1,2,2,1,// : 26
3,1,2,2,1,2,// ; 27
3,2,2,1,1,2,// < 28
3,2,2,2,1,1,// = 29
2,1,2,1,2,3,// > 30
2,1,2,3,2,1,// ? 31
2,3,2,1,2,1,// @ 32
1,1,1,3,2,3,// A 33
1,3,1,1,2,3,// B 34
1,3,1,3,2,1,// C 35
1,1,2,3,1,3,// D 36
1,3,2,1,1,3,// E 37
1,3,2,3,1,1,// F 38
2,1,1,3,1,3,// G 39
2,3,1,1,1,3,// H 40
2,3,1,3,1,1,// I 41
1,1,2,1,3,3,// J 42
1,1,2,3,3,1,// K 43
1,3,2,1,3,1,// L 44
1,1,3,1,2,3,// M 45
1,1,3,3,2,1,// N 46
1,3,3,1,2,1,// O 47
3,1,3,1,2,1,// P 48
2,1,1,3,3,1,// Q 49
2,3,1,1,3,1,// R 50
2,1,3,1,1,3,// S 51
2,1,3,3,1,1,// T 52
2,1,3,1,3,1,// U 53
3,1,1,1,2,3,// V 54
3,1,1,3,2,1,// W 55
3,3,1,1,2,1,// X 56
3,1,2,1,1,3,// Y 57
3,1,2,3,1,1,// Z 58
3,3,2,1,1,1,// [ 59
3,1,3,1,1,1,// \ 60
2,2,1,4,1,1,// ] 61
4,3,1,1,1,1,// ^ 62
1,1,1,2,2,4,// _ 63
1,1,1,4,2,2,// NUL ' 64
1,2,1,1,2,4,// SOH a 65
1,2,1,4,2,1,// STX b 66
1,4,1,1,2,2,// ETX c 67
1,4,1,2,2,1,// EOT d 68
1,1,2,2,1,4,// ENQ e 69
1,1,2,4,1,2,// ACK f 70
1,2,2,1,1,4,// BEL g 71
1,2,2,4,1,1,// BS h 72
1,4,2,1,1,2,// HT i 73
1,4,2,2,1,1,// LF j 74
2,4,1,2,1,1,// VT k 75
2,2,1,1,1,4,// FF l 76
4,1,3,1,1,1,// CR m 77
2,4,1,1,1,2,// SO n 78
1,3,4,1,1,1,// SI o 79
1,1,1,2,4,2,// DLE p 80
1,2,1,1,4,2,// DC1 q 81
1,2,1,2,4,1,// DC2 r 82
1,1,4,2,1,2,// DC3 s 83
1,2,4,1,1,2,// DC4 t 84
1,2,4,2,1,1,// NAK u 85
4,1,1,2,1,2,// SYN v 86
4,2,1,1,1,2,// ETB w 87
4,2,1,2,1,1,// CAN x 88
2,1,2,1,3,1,// EM y 89
2,1,4,1,2,1,// SUB z 90
4,1,2,1,2,1,// ESC { 91
1,1,1,1,4,3,// FS | 92
1,1,1,3,4,1,// GS } 93
1,3,1,1,4,1,// RS ~ 94
1,1,4,1,1,3,// US DEL 95
1,1,4,3,1,1,// FNC3 FNC3 96
4,1,1,1,1,3,// FNC2 FNC2 97
4,1,1,3,1,1,// SHIFT SHIFT 98
1,1,3,1,4,1,// CodeC CodeC 99
1,1,4,1,3,1,// CodeB FNC4 CodeB
3,1,1,1,4,1,// FNC4 CodeA CodeA
4,1,1,1,3,1,// FNC1 FNC1 FNC1
2,1,1,4,1,2,// StartA
2,1,1,2,1,4,// StartB
2,1,1,2,3,2,// StartC
2,3,3,1,1,1,2,// Stop