二维码的生成原理和工作原理
二维码由来
在1994年,这个类似于一个正方形马赛克的图片由日本DENSO WAVE公司发明----两位程序员为了追踪汽车零部件而设计。而现在,应用更为广泛的是由美国人设计的pdf417,datamatrx..其中的pdf417是由留美华人王寅敬博士发明。
其实很长时间里二维码应用于产品追踪,物品识别和库存管理等工业用途。直到智能手机和微信在中国普及,二维码才变成了一个可以被大众随时“扫一扫”的工具,或者说人人手里都有了一个“二维码扫描器”。二维码在中国应用的范围比较广,而在网上支付方面,二维码也存在一定的风险。其实,直接扫码很危险。有网友称其在街头张贴的广告上扫描了一个二维码之后, 手机刚充的100元话费就不翼而飞。他扫描了一个贴在墙上的交友类二维码后,并未下载安装交友软件,然后就被通知手机欠费。结果检测手机发现,被安装了手机病毒软件,导致刚充的话费被偷走。央行在2014年叫停二维码支付后时隔两年,于2016年8月3日官方才重新承认二维码的支付地位。
生成原理:该原理是,用特定的几何图形按编排规律在二维方向上分布,采用黑白相见的图形来记录数据符号信息。
为了利用计算机内部逻辑,用数字“0”和数字“1”作为代码,同时使用若干个与二进制相对应的几何形体表示文字数值信息。
这里面我有几个小知识点想提一提。
知识点一:二维码共有40个尺寸
也就是版本version,Version 1.0是21 x 21的正方形,Version 2.0是 25 x 25的(公式:(V-1)*4 + 21)。所以最大的尺寸就是177 x 177 的正方形。
知识点二:三个点确定一个面
二维码只有三个角上有位置探测图案,就是这个就是为了更好的读取二维码。那有人问为什么不是四个能,这个角也不是多余的,可以镶嵌别的信息。
知识点三:旋转二维码,也可以识别
因为有知识点二中所说的位置探测图案和分隔符,所以,无论是正着扫码,还是竖着扫码,或者斜着扫码,信息都可以被识别。
再来看看,二维码的工作原理:
通过常见的图象输入设备或光电扫描设备,它们可以自动读取,并且会对识别出的信息进行自动处理。
因为每个码制有自己的字符集,一个一个的字符占据自己的位置。所以,通过扫描能读取的数据信息在二维码中的位置是由定位图形和分隔符决定的。才能够快速地识别和处理图形旋转、变化等问题。
二维码可以在水平和竖直方向上进行编码,用正方形的黑白格来记录信息,原理是利用了二进制的0和1,打个比方,现在有一个10乘10格子的二维码,每一行都有黑白格,如果用1表示白色的格子,0表示黑色的格子,那么我们可以用类似“0100101100”这样的一行数字来表示每一行的代码,那么将10个这样的数字行排列起来,就组成了一个二维码,我们扫码就相当于解码的过程,可以识别二维码上的信息。
二维码还具有容错性,一些二维码只需要扫前面几行就可以识别出信息,哪怕二维码局部破损丢失都可能识别信息,不需要扫全,它比普通条形码译码错误率50万分之1还要低,误码率低于1000万分之1。
数据编码
我们先来说说数据编码。QR码支持如下的编码:
假如我们有个HELLO WORLD的字符串要编码,根据上面的示例二,我们可以得到下面的编码
我们还要加上结束符:
按8bits重排
如果所有的编码加起来不是8个倍数我们还要在后面加上足够的0,比如上面一共有78个bits,所以,我们还要加上2个0,然后按8个bits分好组:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000
补齐码(Padding Bytes)
最后,如果如果还没有达到我们最大的bits数的限制,我们还要加一些补齐码(Padding Bytes),Padding Bytes就是重复下面的两个bytes:11101100 00010001 (这两个二进制转成十进制是236和17,我也不知道为什么,只知道Spec上是这么写的)关于每一个Version的每一种纠错级别的最大Bits限制,可以参看QR Code Spec的第28页到32页的Table-7一表。
假设我们需要编码的是Version 1的Q纠错级,那么,其最大需要104个bits,而我们上面只有80个bits,所以,还需要补24个bits,也就是需要3个Padding Bytes,我们就添加三个,于是得到下面的编码:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000 11101100 00010001 11101100
上面的编码就是数据码了,叫Data Codewords,每一个8bits叫一个codeword,我们还要对这些数据码加上纠错信息。
纠错码
上面我们说到了一些纠错级别,Error Correction Code Level,二维码中有四种级别的纠错,这就是为什么二维码有残缺还能扫出来,也就是为什么有人在二维码的中心位置加入图标。
错误修正容量
L水平7%的字码可被修正
M水平15%的字码可被修正
Q水平25%的字码可被修正
H水平30%的字码可被修正
那么,QR是怎么对数据码加上纠错码的?首先,我们需要对数据码进行分组,也就是分成不同的Block,然后对各个Block进行纠错编码,对于如何分组,我们可以查看QR Code Spec的第33页到44页的Table-13到Table-22的定义表。注意最后两列:
Number of Error Code Correction Blocks :需要分多少个块。
Error Correction Code Per Blocks:每一个块中的code个数,所谓的code的个数,也就是有多少个8bits的字节。
生成二维码图片
首先,先把Position Detection图案画在三个角上。(无论Version如何,这个图案的尺寸就是这么大)
然后,再把Alignment图案画上(无论Version如何,这个图案的尺寸就是这么大)
关于Alignment的位置,Table-E.1的定义表(部分)
下图是根据上述表格中的Version8的一个例子(6,24,42)
接下来是Timing Pattern的线
再接下来是Formation Information,下图中的蓝色部分。
Format Information是一个15个bits的信息,每一个bit的位置如下图所示:(注意图中的Dark Module,那是永远出现的)
这15个bits中包括:
5个数据bits:其中,2个bits用于表示使用什么样的Error Correction Level, 3个bits表示使用什么样的Mask
10个纠错bits。主要通过BCH Code来计算
然后15个bits还要与101010000010010做XOR操作。这样就保证不会因为我们选用了00的纠错级别和000的Mask,从而造成全部为白色,这会增加我们的扫描器的图像识别的困难。
下面是一个示例:
关于Error Correction Level如下表所示:
再接下来是Version Information(版本7以后需要这个编码),下图中的蓝色部分。
Version Information一共是18个bits,其中包括6个bits的版本号以及12个bits的纠错码,下面是一个示例:
而其填充位置如下:
然后是填接我们的最终编码,最终编码的填充方式如下:从左下角开始沿着红线填我们的各个bits,1是黑色,0是白色。如果遇到了上面的非数据区,则绕开或跳过。
这样下来,我们的图就填好了,但是,也许那些点并不均衡,如果出现大面积的空白或黑块,会告诉我们扫描识别的困难。所以,我们还要做Masking操作QR的Spec中说了,QR有8个Mask你可以使用,如下所示:其中,各个mask的公式在各个图下面。所谓mask,说白了,就是和上面生成的图做XOR操作。Mask只会和数据区进行XOR,不会影响功能区。(注:选择一个合适的Mask也是有算法的)
其Mask的标识码如下所示:(其中的i,j分别对应于上图的x,y)
下面是Mask后的一些样子,我们可以看到被某些Mask XOR了的数据变得比较零散了。
Mask过后的二维码就成最终的图了。
这里同样有几个有趣的小知识点。
首先,二维码不但只有黑白色的,普遍使用黑白色是为了提高其工作效率。
其次,二维码源于日本,但在我国被发扬光大。
有码胜无码,条形码和二维码不得不说的故事
文|黄绮思 罗雅涵
“嘀——”收银员扫货品条形码,你亮出付款二维码,一句话都不用说,一笔交易就完成了。
当代购物体验这么顺畅,毫无疑问,用户们首先得感谢条形码和二维码的发明人。
据美联社报道,条形码的合作发明者之一乔治·劳雷尔(George Laurer)于12月5日在北卡罗来纳州的家中去世,享年94岁。1970年代在IBM担任工程师时,劳雷尔开发了如今长方形的通用产品代码(UPC),即俗称的条形码。他的逝世,也因此引起了一波怀旧和纪念。
条形码的前世今生
严格来说,最先提出条形码这一概念的人其实并不是劳雷尔。
早在1948年,费城煤气科技学院一位名叫伯纳德·塞尔沃的研究生就曾经尝试着手研发条形码,用以在收银台处自动记录商品。
这时的条形码还不叫条形码,形状也不是长方形而是圆形。伯纳德·塞尔沃和他的同学约瑟夫·伍德兰德最开始使用的是莫尔斯电码,计划将莫尔斯电码中的点线设置成粗细不一的条纹,用以表示特定的数字以及字母。这个想法后来成了各种条码的最基本构想。
最初的圆形码。图片来源:New York Times
最开始的条形码印在半透明的纸上,用强光穿透图像后,投射于可以读取和记录条形码的机器,再进一步转换为信息。在前期,由于照射的光线太弱,照穿条形码后的光线不能作用接收器。二人不得已更换了一只500瓦的大灯泡用以照射条形码,却发现温度过高,烧坏了条码。在加入风扇帮助降温的情况下,整个系统还是开始工作了。
但由于当时科技水平发展的限制,这些被识读的条形码并不能提供足够多有用信息。整个系统体积庞大,噪音过大。尽管二人在1949年为其申请了专利并命名为“公牛眼”,这一技术仍被搁置下来。
到了20世纪60年代,伍德兰德已经成为了IBM的工程师,他并没有放弃自己年少时的想法,而是不断说服IBM投资研究条形码。这时,激光和计算机已经问世;前者可以轻而易举地穿透条形码,后者可以快速且准确地读取、存取和处理条形码上的信息 。终于,大约在1969年末,IBM指派乔治·劳雷尔研究如何制作超市扫描仪和标签。伍德兰德也在这一项目之中。
经过将近四年的艰难研究,IBM终于推出了一种既易于打印同时也能有效传递信息的长方形条形码。这种条形码最终得到了当时的符号选择委员会的认可,被命名为标准商品码(Uniform Product Code)。
1974年6月26日,世界上第一个条形码扫描器被安装在俄亥俄州特洛伊的马什超市里。第一件被扫描的商品是10包箭牌的多汁水果味口香糖。这包口香糖如今已被美国历史博物馆收藏 。
至此,条形码的应用从商品包装逐渐扩展至邮政分拣、书籍管理、行李托运等众多行业。国际物品编码协会最近发布的《GS1全球办公年度报告2018-2019》显示,仅仅是GS1这一种标准之下,每天就超过60亿个条形码被扫描。超过两百万家公司,共1亿种产品正在使用条形码。
远渡重洋,来中国安家
条形码最开始进入中国,并非用于零售业,而是用于邮政系统。根据知网显示,国内最早一篇关于条形码的论文出现在1979年,发表在《中国邮政》的“国外技术动态”一栏,内容是对于条形码及其识别系统这技术的介绍。
接下来的几年中,条形码在我国的应用区域逐渐扩展至图书馆、医院以及商品零售业。1988年12月,经国务院批准成立了国家物品编码协会。“八五”期间,国务院电子信息系统推广应用办公室也将条码技术作为重点推广应用的10项工作之一。1991年4月,我国正式加入国际物品编码协会;1991年6月开始筹建国家条码质量监督检验中心;1991年05月首批五项条码国家标准发布实施;1992年06我国第一家POS系统问世,这才标志着我国正式开始使用商品条码。
近三十年来,条形码已经走入千家万户,在各行各业无不发挥着重要的作用。
打个比方,昨天双十二,你网购了一盒来自日本的口罩,以防北京时不时出现的雾霾。在整个购物过程中,几乎处处有条形码的身影。
如果你是通过代购人肉购买,那么装着你的口罩、托运回国的箱子上,必然绑着条形码的标签。里面包含着代购的个人信息、起飞地、降落地以及航班号。据公开资料显示,自从航空行李托运引进条形码追踪行李后,行李丢失率降低了95%。
如果你是通过官网购买,条形码一样参与其中。据GS1官网显示,我国海关最近为单一窗口申报系统推出了GTIN(Global Trade Item Number,全球贸易商品号)报告功能。这是在海关通关中采用GS1条码的重要一步,有助于我国进出口记录进一步标准化、高效化。
等口罩进入国内进行配送时,条形码更是无处不在。
配送中心接到送货订单后,将信息汇总,对订单进行整理、分析,决定配送的时间段,配送的路线等等。分拣人员扫描条码获得商品的目的地后,会将信息打印出来并贴上拣货标签。接下来就是机器与条形码的互动了——分类机将商品放在传送机上,扫描机扫描条形码,识别商品信息,并检验拣货是否出错。
如果一切都进行顺利,商品会被装入不同的货箱,踏上征程。货箱上的条码也包含着配送信息。整个配送过程中,工作人员会利用条形码阅读器扫描条形码,将数据上传到计算机,随时显示商品的实时位置。这既有利于配送中心及时调整商品运输路线,也有利于盯着某宝物流界面的你缓解焦虑。
等到收货时,你或是迫不及待将手机上的条形码伸向快递柜的扫描窗口,或是向快递小哥报出自己的手机号。“嘀——”收货成功。拆胶带,开箱,扔包装一气呵成。那片毫不起眼的条形码标签被你撕成两半,顺手扔进垃圾桶。
殊不知,正是这小小的条形码,跨越了千山万水,护送商品到达你的手中。
沉默发明者与炙热二维码
尽管条形码的普及让原来要靠手动输入商品价格的超市收银员们摆脱了手腕麻木和“腱鞘炎”的折磨,但新的问题又随之而来:由于容量有限,条形码最多只能记录20个英文数字,假名和汉字还无法识别。这令很多生产线上的企业严重不满,扫描速度和出错率成了新的诟病。
“如何让条码包含更多的信息”成了许多国家,尤其是进入经济高速增长期,超市、大工厂遍地开花的日本尤为考虑的问题。
90年代,正在DENSO WAVE公司任职的腾弘原想到,一条码只能横向记录20个数,如果扩大到点阵式平面,记录的信息自然可以增多。然而做码容易,但如何让这个平面码能够高速读取却不简单。
二维码发明者:腾弘原
腾弘原和另一位同事组成研发小组开始了新的攻克。方块的二维码有四个直角,他们选定其中三个设置为定位符,然后通过仅剩的一个角的位置来判断二维码内容的方向。这样不管手机从任何方向扫码,都不影响内容的读取。
当然,日本人的细节完美主义症也在这上面体现得淋漓尽致。为了避免二维码和其他类似图案相混淆导致识别出错,腾弘原对当时市面上的杂志、海报、纸箱上的图案进行了详尽统计,从而确定二维码定位区的方框使用的黑白区域宽度比为1:1:3:1:1最合适。
经过近两年的反复试错,一个能够容纳7000个左右数字,同时还兼具汉字编码能力的小方块码最终问世。相比于过去的条形码,它不仅在信息存储容量上提升了300倍,扫描速度也快了近10倍。
1994年,DENSO WAVE公司面向全日本公开了二维码,并取名为“Quick Response”(快速响应)。为了让更多人了解并实际使用二维码,创作者腾弘原积极奔波于各个企业,为更多人推介。
很快,从事汽车生产的丰田公司率先在自家的电子看板上采用二维码,并成功借助它提升了公司出货、单据制作的管理效率。随后二维码开始被更多行业所接受,开始应用在食品、药品甚至隐形眼镜生产等方面。
而让二维码开始席卷全社会的,还是因为“疯牛病”等危及食品安全的事件频频出现。饱受食品安全焦虑的人们急需一个完整记录食材生产、流通直到端上餐桌全过程的载体,而能够同时容纳这么多信息并快速显示的,只有二维码,它对生产透明化起到了关键的推动作用。
尽管DENSO WAVE公司拥有二维码的专利权,但却没有收取专利费,这是研发之初就确定的方针,也是研发者腾弘原的初衷:“希望能有更多人使用二维码”。免费从来都是吸引用户的最好手段。很快,二维码就冲出日本,被应用于全世界各地。
遍地开花的中国式扫码
2000年,ISO组织宣布二维码符合国际标准并把其纳入ISO标准集之内,官方的盖章认定让二维码的发展从此更加畅通无阻。
2012年左右,伴随苹果一代iPhone 4S的发布,移动互联网也迎来增长势头最猛的一段时间。根据统计,当时平均每5个美国人中就有一个扫过二维码,欧洲的情况也类似。2012年伦敦奥运会期间,通过二维码签到互动的人数更是达到新高潮。仅一个季度,二维码的使用率相比上一年暴增157%。
然而老外们对二维码商业模式和社会行为的探索似乎到这就止步了,真正把二维码安插到每天出门吃饭购物支付所有环节,在各行业遍地开花的还是中国人。
要论支付技术,中国还只是个苦苦追赶者,当其他国家已经可以地铁和公交站的广告窗上扫码下单时,国内大多数人还停留在揣着现金出门。尽管如此,但中国却有经验有老本——拥有巨量规模的电商产业。淘宝的飞速发展使得支付宝在当时占据了网络支付的绝大部分市场份额。在网购几乎被淘宝和支付宝垄断的同时,线下消费的人们却还在使用现金和刷卡支付。
秉承“让天下没有难做生意”行事风格的阿里,瞄准线下刷卡和找零痛点,率先于2011年7月在支付宝App上新增了“二维码支付”选项,目的是为不计其数的微小商户提供无需额外设备的收款服务。
比POS/NFC支持成本低,对智能手机也没有特殊要求的扫码支付,让商户和消费者都能轻易上手。随后,支付宝还顺势开通了二维码进行银行卡转账和红包码的功能。这个在支付时可以抵扣部分现金的红包相当诱人,它进一步刺激着优先用户使用支付宝进行消费。
在支付宝扫码支付功能上线两年后,据艾瑞咨询调查显示,2013年中国消费者使用过的移动支付手段里扫码支付比例达47.2%,此外有22.7%的网民常用二维码支付手段。
从路边的包子铺、菜市场的小摊主,到街角修补的鞋匠,每个人摊前都挂着一张塑料二维码。为此,阿里还专门创造了“码商”一词,让这些不用购置扫码枪等硬件设备,只要一张“二维码”就拿到移动支付的金融服务入场券的商户,都有了一个统一的称号。
眼看支付宝扫码支付势头强盛,不甘示弱的腾讯,也在2014年上线了微信二维码支付。不同于网购盛行带动支付宝蓬勃发展的路径,拥有数亿日活的微信,更多是凭借人们日常交往中你来我往的一个个微信红包,来撬开移动支付的另一环。
微信收到的红包总要有地方消费,聪明的商家开始接受微信支付付款。从最早时候或直接给商家发红包,演变成商家把收钱二维码打印出来贴在店铺里,微信支付线下交易迅速增加逐渐成为比肩支付宝的另一移动支付平台。
为了抢占中国第三方支付市场的主导地位,两大商业巨头持续你追我赶,战场从线上蔓延至线下。于是自2015年开始很长一段时间里,大街小巷随处可见身穿小褂的支付宝或微信支付推广员,以扫街的方式开展收钱码推广业务,给小商户们普及支付知识,并免费帮他们把个人二维码升级为商家版收款码,再通过补贴活动为他们拉客户。
扫码支付给商户们带来的改变直观可见。不必担心找零、假币问题,卫生的同时还能加快销售速度。除此之外,支付宝、微信还通过补贴政策、费率优惠来吸引小商家。这群线下商业最活跃的群体,也成了移动支付最好的行走广告位。
2016年,央行正式下发了《条码支付业务规范》征求意见稿,标志着二维码支付获得官方认可,中国也由此进入扫码支付在全社会范围内普及的阶段。
二维码就像一只“会不停下金蛋的母鸡”,通过这张小小的码,小微经营者可以接收到N种服务;而对于广大国人而言,扫一扫二维码就像是家常便饭。仅2016年,我国平均每天使用微信扫码的多达10亿人次,支付宝则超过5亿人次,一年移动支付总额近18万亿元,超过日本的GDP。扫码支付荣登网友评选的“新四大发明”。
与中国流行扫码支付不同,这个日本出生的二维码,在它的发源地却显得格外冷清。尽管支付宝和微信已将触角伸向邻国,在日本大力推广移动支付,但许多日本人依旧没有买账,最大的原因在于他们害怕自己的个人隐私会被泄露。此外,日本有着强大的信用环境和信用卡服务,完善的信用卡制度让一卡兼具多功能,在零售、交通、服务等多个领域都可以使用。
热衷于使用信用卡的不只是日本人,在欧美大部分城市,信用卡同样是许多人的第一支付选择。信用卡会定期提供优惠,如开卡送点数,还能跟航空、旅游、买房买车绑定,都是能让人切实体会到的好处。
此外,中国的移动支付并非独立,而是同很多银行达成合作协议,得到了银行资金扶持;而国外许多发达国家的银行基本属于个人所有制,这也就意味着盈利是第一目的,在信用卡消费盛行的情况下,自然不会去考虑移动支付这样投入大周期长的低利润业务,更不会去普及。
从条形码到二维码,从食品、书籍再到扫码支付,一个黑白符号却几乎革新了世界上每个行业,它们就像是渗透在我们日常生活中的移动小端口,从中可以窥探到世界百年浩瀚的发展。在技术专利的背后,是制度、经济与新兴互联网的博弈,更是使用者和应用厂商身份的彼此交织重叠。