Qraft

奇偶校验

奇偶校验是检测数据传输和记录中出现错误的最基本手法。它在数据的位序列上附加 1 个检验用的位(校验位),调整成让整串位序列中 1 的个数为偶数(偶校验)或奇数(奇校验)。接收一方数一下 1 的个数,与预期不符就判定为发生了错误。

二维码中,格式信息(15 位)和版本信息(18 位)的验证应用了奇偶校验的思路。格式信息是存放纠错等级与掩码图案的区域,由 BCH 码(把奇偶校验一般化后的纠错码)加以保护。同一份格式信息会在二维码的 3 个定位图案附近被记录两遍,这也是靠冗余来确保抗错能力。

单靠奇偶校验只能检测出 1 位的错误,而且无法纠正。二维码的数据主体上应用的是里德-所罗门码这种更强的纠错,最多可以在丢失 30% 数据的情况下复原。奇偶校验是它底层的那个想法,「附加冗余的位来验证完整性」这一原理,在校验和、CRC 等各种错误检测技术里都是共通的。

顺便说明它的界限:如果同时有 2 位翻转,1 的个数的奇偶性又回到原样,错误就会被漏掉。位错误常常成串出现,所以现实中的通信几乎不会只靠奇偶校验,而是与 CRC 和纠错码搭配使用。理解「检测」与「纠正」是两件不同的事,是读懂二维码内部结构的第一步。