条形码(barcode),也能够叫作一维码,在生活中普遍存在,包括常见的UPC、EAN、ISBN等等。
你看的每本书、喝的每瓶饮料、买的每件商品,基本均可以看到它们的身影。php
UPC(universal product code,通用产品代码,一般指UPC-A) 是最先投入使用的条形码,在美国、加拿大等欧美国家使用普遍。
尽管UPC很简单,但倒是实现零售业结算和库存管理自动化的基础。
本文就从UPC着手讲解条形码是如何工做的,下文中的UPC的示例摘录自《编码:隐匿在计算机软硬件背后的语言》。git
一般状况下,UPC由30条不一样宽度的垂直黑色条纹组成,条纹间由不一样宽度的空白间隙分割开。
聪明的你必定想到了,这些条纹的含义就是条形码下方的数字,组成了该商品特有的编号。
只不过,下方的数字是方便人阅读,而条形码是方便计算机“阅读”。数组
例如,下图是美国Campbell公司10盎司的罐装鸡汁面包装上的UPC:app
你会发现,黑色条纹粗细不均,空白间隙也是粗细不均的。
事实上,黑色条纹有四种不一样的宽度,较宽的条的宽度是最细条的宽度的两倍、三倍或者四倍。空白间隙亦然。编码
UPC其实是一系列的比特,若是将一个基本单位的黑色条纹当作二进制的1
,将一个基本单位的空白间隙当作0
,就能够露出其“庐山真面目”:spa
当计算机自左向右进行扫描时,它给遇到的第一个基本单位的黑条纹分配一个值为1的比特值,随后的空白间隙为0,如此下去,直到最后一个黑色条纹为止。一共会有95个比特,组成了一个UPC。对这95个比特进行分组:设计
起初的3个比特一般是101
,称为左边护线,最右边的3个比特也是101
,为右边护线,它们的做用是帮助计算机扫描仪定位。
紧挨着左边护线,以7个比特为一组,连续6组,为左边的数字;7个比特为一组,每一组表明着数字0~9中的一个数字。
接着中间是5个比特的中间护线,固定为01010
。这是一种内置式的检错码。若是扫描仪在应当找到中间护线的地方没有找到它,扫描仪就认为这不是一个UPC,以此防止错误或窜改。
接下来的右边的数字跟左边数字同样,7个比特一组,共6组。3d
有意思的是,7个比特组成一组,才表明了10个数字。照理来讲,2的7次方,共128种组合,表明10个数字绰绰有余。
这是由于,仅有少数组合的比特值,才是有意义的。并且,左边的数字和右边的数字,组合还稍有差别。
映射关系以下表:code
数字 | 左边的编码 | 右边的编码 |
---|---|---|
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 |
左边的编码都以0开头,以1结尾,且1的个数都是“奇数”。
右边的编码都以1开头,以0结尾,且1的个数都是“偶数”。
右边的编码是左边编码的补码:凡是1的地方都换成0,凡是0的地方都换成1。
这不是偶然,而是故意为之。如此设计,扫描仪即便从右往左边扫描,它也知道该如何处理。blog
另外咱们还需注意到,每一个代码都仅有两组连续的值为1的比特位,这就意味着每一个数字对应着条形码中的两个竖条。
如此设计还提供了一种用于检测差错和数据一致性的机制,叫作奇偶校验。
若是一组比特位中含有奇数个1,就称之为奇校验;若是含有偶数个1,则为偶校验。
进行解码时,若是发现左边的编码中出现偶数个1,则必定有错。反之亦然。这提供了一种很强的容错性,在生产中意义非凡。
如此一来,30条竖条(左边护线2条竖线,右边护线2条竖线,中间护线2条竖线,左右数字各12条竖线),最终对应成了12个数字:
0 51000 01251 7
在UPC中,第一个数字(这里是0)被称为数字系统字符,不一样数字表明不一样大类的货物。
紧接着的5个数字是制造商代码。在上例中,51000
是Campbell公司的代码。该公司产生的产品都是该代号,须要公司去申请。
再后面的5个数字(01251
)是该公司的某种产品的具体编号,公司自行分配。
最后的数字(这里是7)称做模校验字符,这个字符提供了另一种错误检验。
最后一位的模校验字符的计算方法以下。假设前11位数字分别用A-K符号代替:
A BCDEF GHIJK
经过公式:
3 x (A + C + E + G + I + K) + (B + D + F + H + J)
会获得一个数字T
,而后对该数字T
,从紧挨它并大于等于它的一个10的整倍数中减去它,其结果称为模校验字符。
在上例中,有:
3 × (0 + 1 + 0 + 0 + 2 + 1) + (5 + 0 + 0 + 1 + 5) = 3 × 4 + 11 = 23
紧挨着23并大于等于它的,仍是10的整倍数,就是30, 因此最后一位数字就是30-23 = 7
。
这就是印在外包装上并以UPC形式编码的模校验字符,这是一种冗余措施。
若是扫描仪计算出来的模校验结果和UPC中编码中的校验字不一致,则计算机就不能将这个UPC做为一个有效值接收。
能够看到,简简单单的UPC的设计中,至少就包含了三种校验和容错机制,设计上煞费苦心:
在维基百科上有证实: UPC能够检测出100%的单数字错误,能够检测出90%的数字换位错误。
UPC-A(上面所讲的UPC都是指UPC-A)有多种变种,其中UPC-E
和EAN-13
比较经常使用。
UPC-E是UPC-A(12位数字)的6位数字的缩短版,因为在我国不常见,这里再也不介绍。重点介绍EAN-13。
EAN-13是UPC-A的超集,能够在UPC-A的首位加入一位数字0获得。EAN-13兼容UPC-A,而且将范围扩充为原来的10倍。从EAN-13的前三位数字,还能够看出生产该商品的公司所属国。
EAN(European Article Number,欧洲商品条码)依照结构能够分为EAN-13和EAN-8,但咱们常说的EAN通常特指EAN-13,而EAN-8是EAN-13的8位数字缩短版。
EAN-13的编码内容,由四个部分组成:
有了UPC的基础,再来说EAN-13就简单多了。
还记得讲UPC的时候,分了左边的编码和右边的编码吧。咱们将左边的编码称为L-code,右边的编码称为R-code。如今加入一列: G-code。
数字 | L-code | G-code | R-code |
---|---|---|---|
0 | 0001101 | 0100111 | 1110010 |
1 | 0011001 | 0110011 | 1100110 |
2 | 0010011 | 0011011 | 1101100 |
3 | 0111101 | 0100001 | 1000010 |
4 | 0100011 | 0011101 | 1011100 |
5 | 0110001 | 0111001 | 1001110 |
6 | 0101111 | 0000101 | 1010000 |
7 | 0111011 | 0010001 | 1000100 |
8 | 0110111 | 0001001 | 1001000 |
9 | 0001011 | 0010111 | 1110100 |
当第一位数字(导入位)不一样时,左边的编码稍微调整,右边的编码保持不变(扫描仪依然能够判断是从左到右仍是相反方向)。
使用L表示采用L-code的编码,R表示采用R-code的编码,G表示G-code的编码。
第一位数字 | 左边的6位数字编码 | 右边的6位数字编码 |
---|---|---|
0 | LLLLLL | RRRRRR |
1 | LLGLGG | RRRRRR |
2 | LLGGLG | RRRRRR |
3 | LLGGGL | RRRRRR |
4 | LGLLGG | RRRRRR |
5 | LGGLLG | RRRRRR |
6 | LGGGLL | RRRRRR |
7 | LGLGLG | RRRRRR |
8 | LGLGGL | RRRRRR |
9 | LGGLGL | RRRRRR |
根据映射表,以第一位的导入位为1为例,LLGLGG
表示,左边的6位数字中,一、二、4采用L-code编码,三、五、6采用G-code编码。
根据该对照表,从左边的6位数字编码,就能够反推出第一位数字是什么,这就是为何第一位的导入位能够不计入条形码的一部分。
从第一位的导入位,也能够推出左边的6位数字该分别采用哪一种编码。
检查码的计算在UPC的基础上也很好理解。UPC的部分提到,假设前11位数字分别用A-K符号代替,如今用N表示导入位:
N A BCDEF GHIJK
公式扩展为:
3 x (A + C + E + G + I + K) + (N + B + D + F + H + J)
因为UPC中,N始终为0,所以完美兼容。
举个例子:某条形码为:977167121601X(X为校验码),计算出X。
能够看出,当导入位 = 0
时(等同UPC),无论编码仍是检查码,EAN-13彻底兼容UPC,条形码不须要更改。
前三位数字 | 国家或地区 |
---|---|
690~699 | 中国 |
471 | 中国台湾 |
489 | 中国香港 |
958 | 中国澳门 |
450~459 490~499 | 日本 |
880 | 韩国 |
885 | 泰国 |
500~509 | 英国 |
000~019 030~039 060~139 | 美国 |
300~379 | 法国 |
400~440 | 德国 |
978~979 | 图书ISBN |
977 | 期刊ISSN |
ISBN(International Standard Book Number,国际标准书号)是非期刊书籍上的条形码,其实只是EAN-13的子集(只讨论现使用的ISBN-13)。前三位在978~979
范围内。
一个ISBN有一个或一份相应的出版物与之对应。一本书的每一版或其余的变化,可以申请到一个新的ISBN。
新版本若是在原来旧版的基础上没有内容上太大的变更,在出版时不会获得新的ISBN。
当一本书同时有平装本与精装本出版时,平装本的国际标准书号不得用于精装本,反之亦然。
ISBN的编码由五个部位组成,且每部位是不定长的,有时候会使用-
符号进行分割方便阅读:
9
,前三位目前的范围是978~979)