CODE128不同編碼方式之間的混合編碼


眾所周知,CODE128碼廣泛用於企業內部、物流系統之中,然而,對於該類條碼,卻又有着不同種類的細分
(主要分為以下四種:code128A,code128B,code128C,ean128)。

主要區別如下:

    code128A:標准數字和大寫字母,控制符,特殊字符

    code128B:標准數字和大寫字母,小寫字母,特殊字符

    code128C / ean128:[00]-[99]的數字對集合,共100個

其中,code128C / ean128 因其內部算法從而決定了只能對偶數位的數字進行編碼(兩者區別:ean128在起始位后多了一個標識位,並參與最終校驗位的計算)

 

所以對於編碼方式的選擇,便因使用場景不同而不同。

對於字符串,尤其是純數字的編碼,如果是偶數位,毫無疑問,選擇 code128C / ean128 便是一種最優的編碼方式,但若為奇數位,那么該如何選擇呢?

由於code128A與cede128B均為按位編碼,所以選擇這兩種自然無可厚非,可也正是因為是按位編碼,整體長度便成了該碼制的一大短板。幸運的是,在code128碼制下,是支持內部碼制混編的,也就是說,我們可以采取先使用ean128,再使用code128A的形式,將該數字串的編碼長度縮為最短。那么,該如何進行混合操作呢?

 

下面我們以123456789為例,進行簡單解釋:

對該字符串,我們可以將其拆分為:12,34,56,78,9  這五個部分,對於前四個,以正常的ean128對其進行編碼   

   起始位  標識符  字符1  字符2  字符3  字符4  特殊控制碼  字符5  校驗位  終止位
 編碼 StartC FNC1 12 34 56 78 CODEA 9   STOP
 ID 105 102 12 34 56 78 101   25  76 106 

 

 

 

 

經查詢編碼對照表可知各個編碼的ID如下(紅色表示)

計算校驗位(藍色表示):(105*1+102*2+12*3+34*4+56*5+78*6+101*7+25*8)%103=76

  注:須將特殊控制碼一並計入計算序列,方可得到正確的校驗位!

現在所有編碼元素的id均已獲取,便可根據ID從編碼對照表中獲取對應的BandCode值,從而生成正確可識別的條碼。

其實,對於混合編碼,最重要的一點便是對於校驗位的計算,這里提到的計算方法,是經過實際測試通過並運行的。

 

Code128簡介

Code128碼於1981年推出,是一種長度可變、連續性的字母數字條碼。與其他一維條碼比較起來,相對較為復雜,支持的字元也相對較多,又有不同的編碼方式可供交互運用,因此其應用彈性也較大。

Code128特性

1、具有A、B、C三種不同的編碼類型,可提供標准ASCII中128個字元的編碼使用;

2、允許雙向掃描;

3、可自行決定是否加上檢驗位;

4、條碼長度可調,但包括開始位和結束位在內,不可超過232個字元;

5、同一個128碼,可以由A、B、C三種不同編碼規則互換,既可擴大字元選擇的范圍,也可縮短編碼的長度。

Code128各編碼方式的編碼范圍

1、Code128A:標准數字和字母,控制符,特殊字符;

2、Code128B:標准數字和字母,小寫字母,特殊字符;

3、Code128C/EAN128:[00]-[99]的數字對集合,共100個,即只能表示偶數位長度的數字。

Code128編碼規則:開始位 + [FNC1(為EAN128碼時加)] + 數據位 + 檢驗位 + 結束位

Code128檢驗位計算:(開始位對應的ID值 + 每位數據在整個數據中的位置×每位數據對應的ID值)% 103

Code128編碼表

ID Code128A Code128B Code128C BandCode 編碼值
0 SP SP 0 212222 bbsbbssbbss
1 ! ! 1 222122 bbssbbsbbss
2 2 222221 bbssbbssbbs
3 # # 3 121223 bssbssbbsss
4 $ $ 4 121322 bssbsssbbss
5 % % 5 131222 bsssbssbbss
6 & & 6 122213 bssbbssbsss
7 7 122312 bssbbsssbss
8 ( ( 8 132212 bsssbbssbss
9 ) ) 9 221213 bbssbssbsss
10 * * 10 221312 bbssbsssbss
11 + + 11 231212 bbsssbssbss
12 , , 12 112232 bsbbssbbbss
13 - - 13 122132 bssbbsbbbss
14 . . 14 122231 bssbbssbbbs
15 / / 15 113222 bsbbbssbbss
16 0 0 16 123122 bssbbbsbbss
17 1 1 17 123221 bssbbbssbbs
18 2 2 18 223211 bbssbbbssbs
19 3 3 19 221132 bbssbsbbbss
20 4 4 20 221231 bbssbssbbbs
21 5 5 21 213212 bbsbbbssbss
22 6 6 22 223112 bbssbbbsbss
23 7 7 23 312131 bbbsbbsbbbs
24 8 8 24 311222 bbbsbssbbss
25 9 9 25 321122 bbbssbsbbss
26 : : 26 321221 bbbssbssbbs
27 ; ; 27 312212 bbbsbbssbss
28 < < 28 322112 bbbssbbsbss
29 = = 29 322211 bbbssbbssbs
30 > > 30 212123 bbsbbsbbsss
31 ? ? 31 212321 bbsbbsssbbs
32 @ @ 32 232121 bbsssbbsbbs
33 A A 33 111323 bsbsssbbsss
34 B B 34 131123 bsssbsbbsss
35 C C 35 131321 bsssbsssbbs
36 D D 36 112313 bsbbsssbsss
37 E E 37 132113 bsssbbsbsss
38 F F 38 132311 bsssbbsssbs
39 G G 39 211313 bbsbsssbsss
40 H H 40 231113 bbsssbsbsss
41 I I 41 231311 bbsssbsssbs
42 J J 42 112133 bsbbsbbbsss
43 K K 43 112331 bsbbsssbbbs
44 L L 44 132131 bsssbbsbbbs
45 M M 45 113123 bsbbbsbbsss
46 N N 46 113321 bsbbbsssbbs
47 O O 47 133121 bsssbbbsbbs
48 P P 48 313121 bbbsbbbsbbs
49 Q Q 49 211331 bbsbsssbbbs
50 R R 50 231131 bbsssbsbbbs
51 S S 51 213113 bbsbbbsbsss
52 T T 52 213311 bbsbbbsssbs
53 U U 53 213131 bbsbbbsbbbs
54 V V 54 311123 bbbsbsbbsss
55 W W 55 311321 bbbsbsssbbs
56 X X 56 331121 bbbsssbsbbs
57 Y Y 57 312113 bbbsbbsbsss
58 Z Z 58 312311 bbbsbbsssbs
59 [ [ 59 332111 bbbsssbbsbs
60 \ \ 60 314111 bbbsbbbbsbs
61 ] ] 61 221411 bbssbssssbs
62 ^ ^ 62 431111 bbbbsssbsbs
63 _ _ 63 111224 bsbssbbssss
64 NUL ` 64 111422 bsbssssbbss
65 SOH a 65 121124 bssbsbbssss
66 STX b 66 121421 bssbssssbbs
67 ETX c 67 141122 bssssbsbbss
68 EOT d 68 141221 bssssbssbbs
69 ENQ e 69 112214 bsbbssbssss
70 ACK f 70 112412 bsbbssssbss
71 BEL g 71 122114 bssbbsbssss
72 BS h 72 122411 bssbbssssbs
73 HT i 73 142112 bssssbbsbss
74 LF j 74 142211 bssssbbssbs
75 VT k 75 241211 bbssssbssbs
76 FF I 76 221114 bbssbsbssss
77 CR m 77 413111 bbbbsbbbsbs
78 SO n 78 241112 bbssssbsbss
79 SI o 79 134111 bsssbbbbsbs
80 DLE p 80 111242 bsbssbbbbss
81 DC1 q 81 121142 bssbsbbbbss
82 DC2 r 82 121241 bssbssbbbbs
83 DC3 s 83 114212 bsbbbbssbss
84 DC4 t 84 124112 bssbbbbsbss
85 NAK u 85 124211 bssbbbbssbs
86 SYN v 86 411212 bbbbsbssbss
87 ETB w 87 421112 bbbbssbsbss
88 CAN x 88 421211 bbbbssbssbs
89 EM y 89 212141 bbsbbsbbbbs
90 SUB z 90 214121 bbsbbbbsbbs
91 ESC { 91 412121 bbbbsbbsbbs
92 FS | 92 111143 bsbsbbbbsss
93 GS } 93 111341 bsbsssbbbbs
94 RS ~ 94 131141 bsssbsbbbbs
95 US DEL 95 114113 bsbbbbsbsss
96 FNC3 FNC3 96 114311 bsbbbbsssbs
97 FNC2 FNC2 97 411113 bbbbsbsbsss
98 SHIFT SHIFT 98 411311 bbbbsbsssbs
99 CODEC CODEC 99 113141 bsbbbsbbbbs
100 CODEB FNC4 CODEB 114131 bsbbbbsbbbs
101 FNC4 CODEA CODEA 311141 bbbsbsbbbbs
102 FNC1 FNC1 FNC1 411131 bbbbsbsbbbs
103 StartA StartA StartA 211412 bbsbssssbss
104 StartB StartB StartB 211214 bbsbssbssss
105 StartC StartC StartC 211232 bbsbssbbbss
106 Stop Stop Stop 2331112 bbsssbbbsbsbb

Code128編碼示例:以 95270078 為例

Code128A,開始位對應的ID為103,第1位數據9對應的ID為25,第2位數據5對應的ID為21,依此類推,可以計算檢驗位 = (103 + 1*25 + 2*21 + 3*18 + 4*23 + 5*16 + 6*16 + 7*23 + 8*24) % 103 = 21,即檢驗位的ID為21。

對照編碼表,95270078 編碼表示為:開始位StartA(bbsbssssbss)+ 數據位[9(bbbssbsbbss)+  5(bbsbbbssbss)+2(bbssbbbssbs)+ 7(bbbsbbsbbbs)+  0(bssbbbsbbss)+ 0(bssbbbsbbss)+  7(bbbsbbsbbbs)+ 8(bbbsbssbbss)]+  檢驗位21(bbsbbbssbss)+  結束位Stop(bbsssbbbsbsbb),即:bbsbssssbssbbbssbsbbssbbsbbbssbssbbssbbbssbsbbbsbbsbbbsbssbbbsbbssbssbbbsbbssbbbsbbsbbbsbbbsbssbbssbbsbbbssbssbbsssbbbsbsbb。若要打印,只需將b用黑色線標出,s用白色線標出,一個簡單的條形碼生成程序就完成了!

128B與128A類似,128C只能對長度為偶數的數字串編碼,每兩個數字為一位,所以輸出的信息壓縮了一半,打印的條形碼因此也就較短。接上例,第1位數據95對應ID為95,第2位數據27對應ID為27,第3位數據00對應ID為0,第4位數據78對應ID為78,所以檢驗位 = (105 + 1*95 + 2*27 + 3*0 + 4*78) % 103 = 51

EAN128與Code128C相同,只是在開始位后加多一個控制位FNC1(ID為102),同時將FNC1做為第1位數據加入到檢驗位的計算。

各種方式的編碼結果羅列如下:

編碼方式 開始位 FNC1 數據位 檢驗位 結束位 編碼結果
Code128A StartA 9 + 5 + 2 + 7 + 0 + 0 + 7 + 8 (103 + 1*25 + 2*21 + 3*18 + 4*23 + 5*16 + 6*16 + 7*23 + 8*24) % 103 = 21 Stop bbsbssssbssbbbssbsbbssbbsbbbssbssbbssbbbssbsbbbsbbsbbbsbssbbbsbbssbssbbbsbbssbbbsbbsbbbsbbbsbssbbssbbsbbbssbssbbsssbbbsbsbb
Code128B StartB 9 + 5 + 2 + 7 + 0 + 0 + 7 + 8 (104 + 1*25 + 2*21 + 3*18 + 4*23 + 5*16 + 6*16 + 7*23 + 8*24) % 103 = 22 Stop bbsbssbssssbbbssbsbbssbbsbbbssbssbbssbbbssbsbbbsbbsbbbsbssbbbsbbssbssbbbsbbssbbbsbbsbbbsbbbsbssbbssbbssbbbsbssbbsssbbbsbsbb
Code128C StartC 95 + 27 + 00 + 78 (105 + 1*95 + 2*27 + 3*0 + 4*78) % 103 = 51 Stop bbsbssbbbssbsbbbbsbsssbbbsbbssbssbbsbbssbbssbbssssbsbssbbsbbbsbsssbbsssbbbsbsbb
EAN128 StartC FNC1 95 + 27 + 00 + 78 (105 + 1*102 + 2*95 + 3*27 + 4*0 + 5*78) % 103 = 44 Stop bbsbssbbbssbbbbsbsbbbsbsbbbbsbsssbbbsbbssbssbbsbbssbbssbbssssbsbssbsssbbsbbbsbbsssbbbsbsbb

結合 CODE128 A、B、C,可以生成最優化的編碼,即正確編碼的同時使條碼長度最短, 這也是很多條碼打印軟件支持的,稱

 

 

結合 CODE128 A、B、C,可以生成最優化的編碼,即正確編碼的同時使條碼長度最短, 這也是很多條碼打印軟件支持的,稱為CODE128Auto,具體做法是在編碼中加入編碼控 制符,切換編碼方式。同上例 95270078 字符個數為偶數,采用 codec 最優,編碼方式 為 StartC + 95 + 27 + 00 + 78 + 校驗 + stop,如果字符再增加一位,假設是 952700780,可以修改為 StartC + 95 + 27 + 00 + 78 +codeB + 0 + 校驗 + stop。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM