B2. European Article Number 8 (EAN-8)
上一篇笔记介绍了 EAN 的完整编码形式 EAN-13。这一篇则将介绍 EAN-8 这种缩短版的编码。
EAN-8 常见于包装体积较小、难以按标准尺寸印刷 EAN-13 条形码的商品上。
结构
EAN-8 非常类似 EAN-13,只是各个部分都有所精简。它将 8 个数字分为 4 个部分进行编码。
·系统码 (System Code)。最前面的 2 个数字,用于表示商品所注册的所在国家。
·产品码 (Product Code)。包含 5 个数字。
·检验码 (Check Digit)。一个 1 位的校验用数字。
编码
对 EAN-8 编码前先把 8 个数字分成两段处理,左边四个(左资料码)和右边四个(右资料码)。
对于每个数字,转换成条形码有 2 种形式,分别称为 L、R。R 是 L 的反码。
|
数字
|
L 编码
|
R 编码
|
|
0
|
0001101
|
1110010
|
|
1
|
0011001
|
1100110
|
|
2
|
0010011
|
1101100
|
|
3
|
0111101
|
1000010
|
|
4
|
0100011
|
1011100
|
|
5
|
0110001
|
1001110
|
|
6
|
0101111
|
1010000
|
|
7
|
0111011
|
1000100
|
|
8
|
0110111
|
1001000
|
|
9
|
0001011
|
1110100
|
不同于 EAN-13 的左资料码编码方式(由第一位数字决定,第一位数字不被条形化),EAN-8 的资料码编码方式是唯一的。
左护线、中线和右护线的定义和作用均和 EAN-13 相同。
校验
查阅资料的过程中发现,网上有很多地方关于 EAN-8 的校验的说法是“和 EAN-13 相同”。
这个说法是很模糊的。究竟如何相同?8位数字和13位数字能相同么?
难道是和 EAN-13 一样是奇数位和加上三倍偶数位和,然后模10计算,再用10减?
事实上在我开发解码程序的过程中就有过误解,一度认为是 {10-[(a1+a3+a5+a7)+(a2+a4+a6)*3]%10}%10,结果发现写出来的程序读码始终不对,通不过校验。
事实上,EAN-8 校验位的计算方法是,在8位数字前补5个“0”,然后按 EAN-13 的方式校验。
让我们回顾一下 EAN-13 的校验方式。
全部13位数字分别设为 a1, a2, ..., a10, a11, a12, c。
| c1 = a1 + a3 + a5 + a7 + a9 + a11 |
即奇数位之和。 |
| c2 = (a2 + a4 + a6 + a8 + a10 + a12) * 3 |
即偶数位之和的三倍。 |
| c3 = (c1 + c2) % 10 |
即上述两数之和的个位。 |
| c = (10 - c3) % 10 |
校验码与c3和为10。但若c3为0,c也为0。 |
那么,设 EAN-8 的8位数字分别为 b1, b2, ..., b6, b7, c,连同5个补足的“0”代入上面的式子中,可以得到:
c1 = 0 + 0 + 0 + b2 + b4 + b6
= b2 + b4 + b6 |
即 EAN-8 的偶数位之和。
|
c2 = (0 + 0 + b1 + b3 + b5 + b7) * 3
= (b1 + b3 + b5 + b7) * 3 |
即 EAN-8 的奇数位之和的三倍。
|
| c3 = (c1 + c2) % 10 |
即上述两数之和的个位。 |
| c = (10 - c3) % 10 |
校验码与c3和为10。但若c3为0,c也为0。 |
因而,EAN-8 在计算校验位时,奇偶实际上和 EAN-13 刚好相反。
所以个人觉得简单地说计算方式“和 EAN-13 相同”或者“差不多”是很容易造成误解的……