此稿件为参加萌虎招新的参赛稿件,视频投稿活动正在进行中,详情请戳 萌虎招新。
你再熟悉不过的二维码,其实只是众多二维码的一种。
其中,这些不太常见的行排式二维码,其实就是一维码的堆叠。所以他们与一维码的读取设备兼容。你甚至可以在你的登机牌上找到这种四一七条码。早在2005年,它就被国际航协确立为登机牌的标准二维码。这里储存了你登机牌上的各种信息,有时这种信息量较大的二维条形码就会泄露你的隐私。所以当你在社交网站po出机票时,一定要把这里打码。
而我们最熟悉的这种二维码,叫做QR码,这个名字源自发明者希望其内容可以被快速解码。是的,我们的设备能够很容易识别这种看似无意义的黑白块,但是,如果不借助机器,我们该如何读懂它呢?
首先,我们用积木拼出一个21*21的二维码。这三个标志性的回字形方块,叫做寻像图形,用于帮助读取设备定位到二维码。这两条连接三个寻像图形的黑白相间的线,叫做定位图形,用于确定二维码的密度和版本,辅助二维码的定位。在更高版本的二维码中,你还可以看到和寻像图形相似但尺寸较小的回字形图案,被称为矫正图形,也用于辅助定位。这些地方,都是二维码的固定区域,并不用于存放数据。
而我们需要阅读的,就是剩下的黑白块。首先你要明白,在二维码中,一个黑色方块代表二进制中的“1”,白色代表“0”,所以二维码阅读的结果,就是一串二进制编码。
这里,紧邻着分隔符的地方,储存着二维码的格式信息。前5位记录使用的纠错等级和掩码类型,后10位是对格式信息本身的错误校验。这15位格式信息对于机器读懂二维码来说非常重要,所以在二维码里出现了两次。我们想要读懂二维码,可以先不用管他们,直接像涂答题卡一样,从最右下角开始,按照之字形阅读。
首先,最开头的四个格子,告诉我们,这个二维码的信息是如何被编码的。简单来说,它就是告诉我们,需要每次读几个格子来确定一个字符。例如,这个二维码前4个格子的信息是:0100它采用的就是8位字节模式。这个模式,意味着我们接下来要每8个格子读一次,也就是一个字节。
我们接着读8个格子,它告诉我们,这个二维码储存了多长的信息。00000011,转化成十进制就是,3。所以这个二维码,是一个储存了三个字节信息的二维码。
接下来是正文了,每8位读一次,读3个字节,就可以得到三组二进制编码。紧接着是一个0000的终止符,像是一个句号。剩下的部分,主要是利用里德所罗门算法生成的纠错码。它的存在,使得二维码即使破损、脏污,也有可能被识别。
可是,这三组毫无意义的二进制编码,肯定不是我们想要的答案。如何把他翻译成数字、字母甚至汉字呢?这就需要一本字典。计算机世界中,有一本世界字典,叫做Unicode。它包含了世界上154种语言,总共143859个字符。它为世界上几乎所有字符都分配了一个唯一的编号。以汉字“猫”为例,它在Unicode里的十六进制代码就是,U+732B。
但是,想要把一串二进制和Unicode里的字符做一个对应,还需要一样东西,叫做编码方式。
这些是Unicode可以使用的编码方式,他们可以告诉计算机,你想要表达的是哪个字符。Unicode使用十六进制来给字符编号,所以我们需要把我们读出来的二进制,转化成十六进制,去这本字典里查找,结果是,大写的W、大写的O和大写的E。
这个二维码,你就读完了。
但先不要高兴太早,你平时能够见到的二维码,其实并不能直接阅读。因为他们都是经过加工的。在这个二维码中,其实有很多连续的黑块、白块。这其实并不利于机器有效的识别。所以,二维码在生成的时候,就需要用掩码,来打散这些黑白块。
如何打散呢?我们将掩码,放到这个原始的二维码上。当上下两个方格信息相同,结果就是0。信息不同,结果就是1。于是,一个二维码,就加工好了。两位比较,相同取0,不同取1。这个运算过程,就叫做“异或运算”。
二维码总共有8种掩码可以使用,8种掩码会生成8个结果,计算机会对每种结果进行评估,选择最有利于识别的一个,生成二维码。
面对一个加工后的二维码,你首先需要破解出二维码使用的是哪一种掩码,并将其复原。听起来很难对吧?好在异或运算是可逆的,你再用掩码运算一次,可读的二维码就显示出来了。还记得这个非常重要的格式信息吗?把他和10101异或运算后,它就能告诉我们使用的到底是哪款掩码。
所以,拿到一个二维码,通过格式信息知道它所用的掩码,再用掩码异或运算,得出可读的二维码。再按照之字形读4格,知道二维码的数据类型,以及每次需要读几位;再读长度信息,知道字符长度,也就是需要读几次;最后将读出来的二进制数据,用对应的编码方式,去对应的字典里找。一个看似毫无意义的二维码,就被你读懂了。
实际上,二维码早在1994年就已经发明了。发明者原昌宏,想要让当时超市里通用的条形码能够储存更多信息。当QR码发明后,他所在的公司表示,QR码完全公开,让它能够成为人人都能自由使用的编码。20年后,借助着智能手机的发展,QR码已经无处不在了。未来会不会出现三维码?会不会出现更优的编码形式呢?值得期待。