为什么二维码里面有三个大方块?

为什么⼆维码⾥⾯有三个⼤⽅块?
为什么超市售货员扫⼀下条形码就能结账?为什么别⼈扫⼀下你的⼆维码就能加上你的?⼩⼩的条形码、⼆维码中究竟如何蕴藏如此多不同的信息?今天,就让我们和孩⼦们⼀起⾛进条形码、⼆维码的世界吧!
撰⽂ | 吴进远
我们前⼀篇⽂章讨论了摩尔斯电码,谈到它对当代的计算机技术有着深刻的影响。这种影响并不是在具体的编码⽅法上,⽽主要是体现在思维⽅法上。液氨是怎么生产的
现在我们购买到的⼤多数商品,包装上⾯都有条形码。条形码初期存在多个发明,现在也存在⾮常多的变种。条形码可以算是和摩尔斯电码沾点边,因为早期的⼀位发明家曾经受到过摩尔斯电码的启⽰。确实,从某种意义上说,我们可以想象把摩尔斯电码的点和划,垂直画成线,变成窄和宽的条纹。当然现在主流应⽤上的条形码,并不是简单地从摩尔斯电码转换来的。
条形码世界
今天,计算机越来越多地参与着我们⽣活的⽅⽅⾯⾯。为了把信息迅速⽅便地送⼊计算机,⼈们设计了各种各样的编码,条形码就是其中的⼀种。其他的编码⽅法,⽐如RFID,尽管成本越来越低,但相⽐之
下,条形码仍然是最便宜的,其成本⼏乎为零,因为条形码只需要⽤油墨印在包装盒上即可。
条形码是怎样将信息编码的呢?对于不同的应⽤存在许多标准。我们这⾥介绍⼀下其中⼀个标准,即GTIN-13以及它所对应的条形码编码标准EAN-13。GTIN是Global TradeItem Number的意思,其中的GTIN-13标准是⽤13位数字代表全球贸易中的万物。其中最⾼的三位代表⽣产物品的国家,⽐如中国⽣产的产品前三位是690-695。其余⼀些位数表⽰地域,⾏业等信息,靠后的⼀些位数是物品的代码。如果13位数全部⽤满,可以表述10万亿种不同的物品,⾜够全球所有⼈每⼈研发1000种不同的商品。
我们现在在市场上买到的商品,⼤部分都有这样⼀个13位数的代码。GTIN兼容了国际标准书号(ISBN),国际标准期刊序号(ISSN)等等。当GTIN-13需要印刷成条形码的时候,使⽤的是EAN-13条形码标准。
⽐如作者参与写作的⼀本科学普及书的条形码,如下图所⽰。对于图书,不管是哪个国家出版的,其前三位都被指定为978或979。⽽杂志期刊等,前三位总是977。
⼤家可以仔细观察上⾯的条形码,我们可以看到数字5出现了⼏次,不过它们似乎长的不完全⼀样,在左边的两个是⼀个样,⽽在右边的两个显然不同。如果认真看看,左边与右边条纹是“⿊⽩颠倒”的关系。可是,再看看左边出现的两个7,它们似乎也不⼀样。此外,在条形码左边与右边各有6位数字,
这并不难理解,但整个码符号的最左边那个9是怎么来的?难道可以⽆中⽣有吗?
为此,我们需要了解⼀下EAN-13(包括ISBN,ISSN,UPC等)条形码的⽣成规则。
条形码的编码规则
EAN-13条形码是⽤两个条纹来表⽰⼀个数字的,整个码包括13个数字,其中直接编码12个,左边6个右边6个,第13个⽤后⾯介绍的⽅法隐含编码。条形码两边与中间安排了起始符(S)中间符(M)以及结束符(E),各为两个窄条。因此,所有码,不管具体数字是什么,都包含有30个条纹。
那么,每个数字⼜是怎样⽤两个条纹表⽰的呢?这就需要我们在更细尺度上讨论。每个数字的两个条纹,包括了两⿊两⽩四个区域,它们的总宽度为7个单位宽度。这个单位宽度可以根据印刷精度⾃由选择,⽐如当我们把单位宽度选定为0.5毫⽶时,每个数字所占宽度为3.5毫⽶。
对于左边6个数字,每个数字的左边⼀定是⽩的,⽽右边⼀定是⿊的。每个数字从左到右都是“⽩⿊⽩⿊”地构造。这样,当⼏个数字⼀个个紧挨在⼀起的时候,它们之间就可以存在⼀个清晰的边界。
了解了这些,我们就可以想象⾃⼰是当年制定这种条形码的设计师,很容易地数⼀数可⽤的编码有哪些。
我们可以把7个单位宽度组合在⼀起,看成7个⽐特的⼆进制数。如果这7个⽐特可以任意安排⿊⽩,则可以表达128个
我们可以把7个单位宽度组合在⼀起,看成7个⽐特的⼆进制数。如果这7个⽐特可以任意安排⿊⽩,则可以表达128个字符。不过我们已经限定最左边⼀定是⽩⾊,最右边⼀定是⿊⾊,这样就只有中间5个⽐特可以改变,或者说最多可以表达32个字符。把这32个可能的字符全部画出来,就得到下⾯这个图。
现在,我们把不符合“⽩⿊⽩⿊”要求的字符去掉,还剩下20个可⽤的字符。这20个字符⼜可以分成两类,⼀类包含有奇数个(3个或5个)单位宽度为⿊,共10个,另⼀类包含有偶数个(2个或4个)单位宽度为⿊,也是共有10个。我们把这两类字符分别⽤来作为0-9数字的代码。其中奇偶性为奇的10个称为EAN-L码,在上⾯图中⽤浅棕⾊标注。奇偶性为偶地10个称为EAN-G码,在上⾯图中⽤浅绿⾊标注。这两种左边的条形码如下图所⽰。
那么,右边的条形码⼜是什么样的呢?我们希望最终的条形码具有⼀定的对称性,⽐如希望右边的码左⿊右⽩,这样可以与结束符(E)有⼀个清晰的边界。因此最简单的⼀个做法,是把EAN-L码⿊⽩颠倒,这样我们就有了EAN-R码,如下图所⽰。显然,由于EAN-L的奇偶性为奇,因此很容易看出EAN-R的奇偶性为偶,⾥⾯⿊条的总宽度为偶数个单位宽度,与EAN-L正好反过来。
有了左边与右边数字的条形编码图形,我们就很容易拼接出⼀个完整的条形码。当我们只需要编码12个数字时,也就是说当13位数中最⾼位为0时,左边6个数字都⽤EAN-L码,右边6个数字则⽤EAN-R码。把数字与S,M,E符拼接在⼀起后,我们就可以得到如下图所⽰的条形码。
检测卡我们前⾯问过⼀个问题,在13位编码的整个条形码码符号的最左边那个数字(我们前⾯图书的条形码中的9)是怎么来的。此外,⼤家还会问,我们前⾯谈到的EAN-G图形能不能⽤在条形码的左边,代替EAN-L码?实际上,这两个问题是联系在⼀起的,EAN-13中,最左边那个数字,就是利⽤EAN-G图形,代替左边6个数字中⼀部分EAN-L图形来表述的。
在条码左边6个数字中,每个数字可以选⽤L或者G两种码。因此通过选择每⼀位的L或G,⼀共可以得到64(2的6次⽅)种组合。⼈们从这64种组合中,挑出了10个组合,⽤来表述13位编码中的最左边那个数。这10个组合以及它们代表的数字为:
0=LLLLLL;1=LLGLGG;2=LLGGLG;3=LLGGGL;4=LGLLGG;5=LGGLLG;6=LGGGLL;7=LGLGLG;
8=LGLGGL;9=LGGLGL。
这样⼀来,最左边这个数不需要直接⽤⼀个单独的图形表述,⽽只需要通过选配左边6个数字编码图形的L或G组来“隐喻”。
仿真海枣树
现在我们再回过头看我们前⾯那本书的条形码,原来的⼀些疑问也就豁然开朗了。
⾸先,右边的两个5与左边的两个5⾃然不会是相同的,我们知道 EAN-L 与 EAN-R 对应的10个编码,是⿊⽩反转的关系。那么,同在左边的相同数字编码⼀样吗?不⼀定。⽐如上⾯条码中左边的两个7,它们⼀个是 L 码另⼀个是 G 码。因为这个条码编码了第13位数字9,因此左边6个数字的L或G的选择为9=LGGLGL,因此它的第⼀个7是L⽽第⼆个7是G,所以这两个7长得不⼀样。此外,我们还可以看出左边的两个5恰好都是L,否则它们也未必相同。
条形码带给我们的启⽰
在很多编码⼯作的实践中,我们的着眼点是提⾼编码的效率。也就是说,利⽤尽量少的资源来存储或者传输⽐较多的信息。但是在设计条形码的时候,更需要考虑的,是可靠性和准确性。为此,我们可能会“浪费”⼀些编码资源,来提⾼编码的冗余度。
57cao在前⾯谈到的条形码中,每个数字的编码空间有7个单位宽度,如果充分利⽤可以编制128个字符。但是我们对编码空间作了限制:(1)左⽩右⿊,(2)包含两个条纹。这样⼀来,这个编码空间中就只剩下20个可以⽤的组合了。但是这样做带来的好处⾮常多。⾸先是两个数字挨在⼀起,它们之间存在⼀个⿊⽩清晰的边界。同时在每个数字的编码空间中,也不会出现⼀⼤⽚⿊,或者⼀⼤⽚⽩的状况,⽽是存在⾜够的⿊⽩变化,便于扫描器辨别。更重要的是,这样的编码⽅法提供了很多简便的查错⽅
法。⽐如⼀个完整的条形码,不论是什么内容,总是包含30个条纹。这样,当扫码器扫过之后如果发现多于30或少于30个条纹,⽴即就能知道是出错了。
截瘫行走器后如果发现多于30或少于30个条纹,⽴即就能知道是出错了。
条形码应⽤中,还会出现⼀个常见的复杂性,就是扫码器既可能从左向右正着扫,也可能反过来扫。这就要求条形码⾃⾝携带左右标识。当我们在条形码的左边使⽤EAN-L码,右边使⽤EAN-R码的时候,条形码的左右就⾮常分明。左边所有数字的奇偶性为奇,右边所有数字的奇偶性为偶。当我们需要编制13位数编码,因此在左边6个数中有些会使⽤EAN-G码的时候,左边有些数字的奇偶性也可能呈现偶。不过,我们前⾯看到,左边6个数中最左边那⼀位总是使⽤L码,这就⾜以作为条形码的左标识了。一氧化氮 笑气
从条形码到⼆维码
条形码毫⽆疑问是⾮常成功的,但由于条形码是编码空间是⼀维的,因此可以携带的信息⾮常有限。很⾃然,⼈们想到要向平⾯上两个维度发展。多年来,⼆维的条形码出现过许多标准及变化。我们今天经常看到的⼀种是QR码。下图所⽰QR码是作者创作的⼀个科学普及⾳乐视频⽂件在微云上的链接。
这⾥特意提醒⼀下读者,⼀个⼆维码当中,直接编码的内容是⼏⼗乃⾄上百个字母或数字,它们通常构成⼀个链接,但它们不是视频⽂件本⾝。视频⽂件往往会需要⼏⼗ MB 乃⾄⼏⼗ GB 存储空间,⼆维码存储不了那么多的数据。
当然,⼆维码要容纳⼏⼗乃⾄上百个字母和数字也并不容易。对⽐条形码,⼈们对⼆维码在可靠性和准确性上的要求是⼀样的。但是,⼆维码要⽐条形码容纳更多的信息,因此还必须兼顾编码的效率。这两项要求在有的情况下是⽭盾的,但是在很多时候⼆者是相辅相成的。
⼆维码扫码使⽤时通常是⽤⼿机来拍照,在⼿机内得到⼀个由像素构成的⼆维点阵。⼿机中的软件只有可靠准确地获得了⼆维码的⾼度宽度等外形参数,才能正确地读取编制在⼆维码中的数据。那么,怎样才能⽅便地获取⼆维码的外形参数呢?这就需要我们在设计时作出仔细的考虑。
从QR码上,可以看到在左上⾓,右上⾓和左下⾓各有⼀个⼝字形或回字形的⽅块。我们应该可以猜测出,这三个⽅块就是为了提供⼆维码外形参数的。
问题是,为什么需要三个⽅块呢?只在左上⾓上留⼀个⽅块⾏不⾏?我们知道⼿机的照相机照出来的照⽚是会发⽣形变的,如果只有⼀个⽅块,就很不容易获取⼆维码的⾼度和宽度这两个参数。
如果只留两个⽅块,⽐如,保留右上⾓和左下⾓这两个⽅块。这好像也不⾏,因为在⼿机的照⽚中,
软件⽆法去辨认哪边是上哪边是下。如果只保留左上⾓和右上⾓两个⽅块,则上下倒是可以区分出来了。但是由于⼿机照⽚的形变,我们只能得到⼆维码宽度这个参数,⽽很难得到⾼度这个参数。因此,我们现在看到的⼆维码⾥⾯有三个⼤⽅块。
我们这⾥谈到的仅仅是⼀些最基本的考虑,实际上⼆维码⾥的学问还是不少的,这⾥有⼀个问题提供给⼤家思考。下⾯这个⼆维码中,只包含了⼀个字母“a”。既然只有⼀个字母,那么这个字母占据的⾯积应该是很⼩的吧?因此在整个码所占的⾯积中,应该⼤部分是空⽩。
但是,我们并没有在上⾯这个⼆维码中看到⼤块的⽩⾊或⿊⾊区域,⽽是到处都是错落有致,⿊⽩相间。⼤家不妨想想为什么要这样设计?⽤什么办法可以做到这点?
孩⼦们在世间遇到的问题从来不会按照教科书的次序,先易后难。他们可能还没有学过⼆进制,但却可能在任何时候到⼀个条形码或者⼆维码来问家长。怎样才能不被孩⼦问住呢?很简单,和孩⼦⼀块⼀堆条形码或⼆维码⼀块研究研究,规律,再上⽹查查,定会有所收获。

本文发布于:2024-09-23 07:24:39,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/219502.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:条形码   维码   编码   数字
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议