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

       每次去超市,收银员手拿扫码枪“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;

https://i-blog.csdnimg.cn/blog_migrate/dfdd775102fc187d65fc010dad9647cc.png

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

https://i-blog.csdnimg.cn/blog_migrate/755db5d761150c15a8be5027c348891c.png

       编码规则采用的是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。可以试着用尺子测量一下,看看条形码总的宽度是不是总是这么宽。

https://i-blog.csdnimg.cn/blog_migrate/e8b0f7caeb584b6f1b88f0f9ad93e7a0.png

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

https://i-blog.csdnimg.cn/blog_migrate/1efc925aec5cafccb4ede58fbeebf61f.png

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

小贴士:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beryl2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值