图版 45 · 信息
埋掉一块,照样能扫
2013 年,里约热内卢把二维码用黑白两色的石块铺进了海滨步道。风把沙子吹上来,盖住一部分,手机照样能读。二维码里有一部分方块什么内容也不写,专门用来修补其余的方块。它们是怎么知道哪里错了的?
向下滚动
石头铺成的二维码
2013 年 1 月 25 日,里约热内卢在伊帕内玛海滩尽头的阿尔波阿多尔礁石旁,往海滨步道里铺下了第一批二维码。用的就是这座城市那些著名人行道马赛克的黑白石块。用手机对准它,会打开一张地图,以及用葡萄牙语、西班牙语或英语写的当地介绍。市政府计划铺 30 个。
你面前这块路面也是这样铺的,每个小方格两块石头宽。它的图案写着本页的网址,你的手机现在就能从屏幕上读出来。上面没有一个方格是装饰:每一格都有用处,有些方格存在,只是为了修补别的方格。
一块铺着二维码的海滨步道路面,按标本的样子切下 · 每个方格两块石头宽
三只眼睛
二维码 1994 年诞生在电装波(Denso Wave),当时是汽车零件商电装公司的一个部门,汽车业用它来管理工厂里的零件。原昌宏带领的两人小组想要一种扫描器读得快、从哪个角度都能读的码。读码器的第一件事,是把码找出来。三个角上的大方块,就是干这个的。
沿任何一条穿过中心的线切过去,都会遇到黑、白、黑、白、黑,宽度之比 1:1:3:1:1。他们翻查了传单、杂志、纸箱上的印刷图案,挑出最少出现的那个比例。三只“眼睛”之间各有一行黑白相间的方格,告诉读码器方格的间距;角落里还有一只小些的第四只眼睛,帮它校正斜着看时的变形。
弯弯曲曲的字节
网址里的每个字母都变成一个字节:八个方格,黑表示 1,白表示 0。它们排在两格宽的竖条里,从右下角往上走,到顶后换到下一条往下走,绕开眼睛和那两行定时方格。最前面有一小段开头,说明“下面是字节”以及有多少个。
网址占 29 个字节,这个码一共能放 44 个,剩下的用固定的填充字节补满。后面还有 26 个,标成蓝色。它们不写任何内容。它们是备用字节,接下来这个码能挺住,全靠它们。
蒙版
字节直接铺上去,可能留下大片同色的方块、长长的条纹,或者碰巧拼出一个像眼睛的图案,这些都会让相机犯糊涂。所以编码时会试八种固定的图案,图案说翻转的地方就把方格黑白对调,再给每种结果打分:大色块、长条纹、假眼睛、黑白比例失衡都扣分,最后留下得分最好的那个。
读码器得知道用的是哪种图案,才能把方格翻回来。这件事,连同这个码带了多少备用,写在眼睛旁边的 15 个方格里(紫色),写了两遍,还带着它自己的一小套纠错码,因为它一旦读不出,其余什么都读不出。
步道上的沙子
第一个码还没铺好,市政府就担心,刮风的日子,海滩上的沙子会吹上步道,让它难以读出,还说要给石头刷一层清漆。让风吹吧。沙子埋住一个黑方格,读码器看到的就是白的;丢了一个方格的字节,整个字节就错了(标成红色)。
码照样能读。里德-所罗门码由欧文·里德和古斯塔夫·所罗门在 1960 年发表,每个备用字节都由全部数据字节一起算出来,用的是一套只有 256 个数的算术,加和乘的结果都还在这 256 个数里。字节一出错,备用字节就和数据对不上;对不上的样子,正好指出哪几个字节错了、该是什么。修一个错字节要花两个备用字节:一个找位置,一个找原值。这个码的 26 个备用字节,能修好任意 13 个。
修不好的时候
再吹些沙子。错的字节超过 13 个,读码器就停下了。它不瞎猜:备用字节能告诉它,损坏已经超出能修的范围,它宁可什么都不报,也不报一个错的。读错并非不可能,但那需要损坏恰好把它变成另一个合法的码,这种巧合极少见。
做码的人可以决定带多少备用:L、M、Q、H 四级,分别能救回全部字节的大约 7%、15%、25%、30%。备用越多,同样的内容需要的方格就越多。看同样的沙子落在用 H 级写的同一个网址上:码从每边 29 格长到 33 格,又能读了。中间印着标志的二维码也是这个道理:标志就是它事先准备好要挺过去的损坏。
你来试试
选一个纠错等级,吹进沙子,再点按石块把它们敲掉。码上的读码器会告诉你,它还读得出什么、正在修补多少个字节。
试一试选 L 级,沙子吹到多少,码就读不出来了?换成 H 级呢?
模型省略了什么
码和读码器都是真的:编码按 ISO/IEC 18004 标准做,结果和另一个独立的编码程序逐格相同,手机能扫出来。读码器也真的用里德-所罗门算法找出并改正错字节。简化的是相机这一步:我们的读码器直接拿到方格网,像拍了一张完美的照片,每格按中心的颜色判黑白。手机得先在照片里找到码,校正角度和光线,再定出每一格的位置;在真的路面上,阴影、湿石头、斜着的视角都会增加错误。不同的读码器对眼睛的要求也不一样:我们的要求三只眼睛都在,有的读码器在眼睛受损时也能凑合。这里的沙子和敲掉的石块,只会让黑格变白。
一个常见的误解
备用字节不是内容的第二份副本。两份副本对不上时,无从知道哪份是对的;要防住同样多的损坏,副本也要占多得多的地方。“H 级能救回 30%”也不是说盖住任意 30% 的面积都行:算的是被碰到的字节数,零零散散的污点比一整块同样大的缺口碰到的字节更多;三只眼睛和格式信息也不靠这些备用字节来修。
资料来源

