一张条形码的“成才”之路

       每次去超市,收银员手拿扫码枪“bi~”扫一下条形码,照出一道红色光线就可以将商品的信息全部展现在显示屏上。神不神奇?我们今天就来讲讲机器是如何读取的。

一张条形码的“成才”之路

       我们先来看看条形码下面的数字。一维条形码共13位,如上图其条形码为6 971439 755073,其中1~3位代表的是商品的出产地区(国家),如690~699是*的代码,由国际上分配。目前只开到697,也就是说,如果你在市面上看到698或者699开头的条形码,那可能需要考虑下商品的真假了。4-8位代表着生产厂商代码,由厂商申请,国家分配。9-12位代表着厂内商品代码,由厂商自行确定。第13位是校验码,依据一定的算法,由前面12位数字计算而得到,计算方法如下:

1:取出该数的奇数位的和,c1=6+7+4+9+5+0=31;

2:取出该数的偶数位的和,c2=9+1+3+7+5+7=32;

3:将奇数位的和与“偶数位的和的三倍”相加。

4:取出结果的个位数:127(127%10=7);

5:用10减去这个个位数:10-7=3;

6:对得到的数再取个位数(对10去余)3%10=3;

一张条形码的“成才”之路

       下面我们来说说条形码的原理。首先条形码黑色代表只二进制的1,白色代表着0,0.33mm宽度条为几个基本二进制,也就是说宽的黑色线条表示几个二进制1相连,如下图所示。

一张条形码的“成才”之路

       编码规则采用的是EAN-13编码(不是ASCII码),如0000 101 并不代表5(ASCII码),而是对应下表进行解码,应该按照官方给的如下编码表进行解码,查找下面的表发现是左侧数据符的偶性字符(B组)中的6。起始符、终止符编码为101,分隔符编码为01010。

一个数字由7个二进制位组成,(13-1)*7+11 = 95个黑色或者白色的单位宽度0.33mm的条,其中的11个二进制位是起始符,95*0.33 = 31.35mm = 3.135cm。可以试着用尺子测量一下,看看条形码总的宽度是不是总是这么宽。

一张条形码的“成才”之路

       第2位9对应的编码为0001011,属于左侧数据符、奇性字符。扫码枪从左向右顺序扫描,从第2位开始前六个扫到属于左侧字符,后六个扫到属于左侧字符。这样可以判断扫码枪或者一维码有没有拿反,防止扫描错误。同时我们记录下左侧六位字符属于奇性或是偶性字符,如奇,偶,偶,偶,奇,奇。再查下面的表(o代表奇性,E代表偶性),得到其对应的前置码为6。

一张条形码的“成才”之路

扫码枪扫描得到前6位数并推导出第一个前置码,得到7位数6920152。然后同理扫描右侧六位数据符,不需要记录奇偶性。扫描右侧字符得到461020,就得到了现在总的条形码——6 920152 461020。

小贴士:

扫码枪利用条形码上面黑白条反光率不同的原理,通过射出的红色光线得到的反射强度不同,将光电传感器转为电信号。再滤波放大后将信号转为数字信号0、1。