二维码的故事

二维码的火爆估计连当初设计之人都没有预料到,在国内,二维码应用渐趋广泛,也归功于微信和支付宝,连农村不识字的老大爷及老太都知道扫码支付和转帐。而对于IT从业者来说,可能每天都与二维码打交道。那什么是二维码呢?

二维码的名称是相对与一维码来说的,比如以前的条形码就是一个“一维码”,它的优点有:二维码存储的数据量更大;可以包含数字、字符,及中文文本等混合内容;有一定的容错性(在部分损坏以后可以正常读取);空间利用率高等。

二维码的定义

百度百科介绍:二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。

二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。

中国对二维码技术的研究开始于1993年。中国物品编码中心对几种常用的二维码PDF417、QRCCode、Data Matrix、Maxi Code、Code 49、Code 16K、Code One的技术规范进行了翻译和跟踪研究。随着中国市场经济的不断完善和信息技术的迅速发展,国内对二维码这一新技术的需求与日俱增。中国物品编码中心在原国家质量技术监督局和国家有关部门的大力支持下,对二维码技术的研究不断深入。在消化国外相关技术资料的基础上,制定了两个二维码的国家标准:二维码网格矩阵码(SJ/T 11349-2006)和二维码紧密矩阵码(SJ/T 11350-2006),从而大大促进了中国具有自主知识产权技术的二维码的研发。

二维码基础

首先,二维码一共存在40种尺寸。在官方文档中,尺寸又被命名为 Version,尺寸与 Version 存在线性关系:Version 1是21 x 21的矩阵,Version 2是 25 x 25的矩阵,,每增加一个version,就会增加4的尺寸,公式是:
(V-1)4 + 21(V是版本号)
最高Version 40,(40-1)
4+21 = 177,所以最高是177 x 177 的正方形。二维码结构图:

其中:

  • 位置探测图形:用于标记二维码矩形的大小;用三个定位图案即可标识并确定一个二维码矩形的位置和方向了;
  • 位置探测图形分隔符:用白边框将定位图案与其他区域区分;
  • 定位图形:用于定位,二维码如果尺寸过大,扫描时容易畸变,时序图案的作用就是防止扫描时畸变的产生;
  • 校正图形:规格确定,校正图形的数量和位置也就确定了;
  • 格式信息:表示改二维码的纠错级别,分为L、M、Q、H;
  • 版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。
  • 数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)。

数据编码

数据分析:确定编码的字符类型,按相应的字符集转换成符号字符;选择纠错等级,在规格一定的条件下,纠错等级越高其真实数据的容量越小。

数据编码:将数据字符转换为位流,每8位一个码字,整体构成一个数据的码字序列。其实知道这个数据码字序列就知道了二维码的数据内容。


二维码支持的数据编码模式

纠错编码:按需要将上面的码字序列分块,并根据纠错等级和分块的码字,产生纠错码字,并把纠错码字加入到数据码字序列后面,成为一个新的序列。

构造最终数据信息:在规格确定的条件下,将上面产生的序列按次序放如分块中。按规定把数据分块,然后对每一块进行计算,得出相应的纠错码字区块,把纠错码字区块 按顺序构成一个序列,添加到原先的数据码字序列后面。

构造矩阵:将探测图形、分隔符、定位图形、校正图形和码字模块放入矩阵中。

掩摸:将掩摸图形用于符号的编码区域,使得二维码图形中的深色和浅色(黑色和白色)区域能够比率最优的分布。

格式和版本信息:生成格式和版本信息放入相应区域内。版本7-40都包含了版本信息,没有版本信息的全为0。二维码上两个位置包含了版本信息,它们是冗余的。版本信息共18位,6X3的矩阵,其中6位时数据为,如版本号8,数据位的信息时 001000,后面的12位是纠错位。

为啥不会重复

简单来说,二维码组合方式多,生成的信息容量大不会影响使用。每个二维码承载的信息都是一个独特的信息,不会出现重复的情况。所以不用担心二维码多重复的情况。

这是一个很著名的故事:阿基米德与国王下棋,国王输了,国王问阿基米德要什么奖赏?阿基米德对国王说:“我只要在棋盘上第一格放一粒米,第二格放二粒,第三格放四粒,第四格放十六粒......,按这个方法放满整个棋盘就行。”国王以为要不了多少粮食,就随口答应了,结果国王输了。

心得

研究二维码的过程不禁感叹,二维码规则的制定当真是凝聚了多少研究者的心血。学无止境,在知识的海洋中,当真是需要抱着敬畏之心和谦卑的态度,才能体会到这片海洋的浩瀚。