QR Code Demystified - Part 4

Matcha Design - Tuesday, June 14, 2011

我本打算稍后再进行错误修正,但它确实更适合这里. Before error correction is done, 我们生成的数据必须被分解成“码字”, which are just 8-bit bytes. 我们所要做的就是将上一篇教程中的“位流”分成8位的部分. 每个数字用0 ~ 255的数字表示.

里德-所罗门算法使用伽罗瓦场来计算数据. 因为我们处理的是每个单词8位,所以我们需要长度为256的伽罗瓦域. 这可以手动计算,但使用简单的数组要容易得多. Values of αx 在表4中可以找到,而在表5中可以找到相反的.

显示/隐藏表4 - α到值的指数

显示/隐藏表5 - α指数的值

当我们运行生成错误修正数据所需的计算时,这些值将非常重要. Next, let's get into the actual process. 首先,我们使用表6计算出每个块中有多少个纠错码字. 然后我们在表7中交叉引用它以获得生成器的值. 结果得到的逗号分隔列表表示α的指数. 要查看块的分解,请参见页面底部的表8. 显示的数字是每个块的总码字计数,以及块的数量. For example, 10版纠错L符号有2块86个码字, and 2 of 87 code words. 表6表示用于纠错的码字的数量, and the remainder are for data.

基本上,我们从一个值数组开始——数据码字的值, 然后是若干个等于错误纠正码字数目的0值. 例如,对于带有M Error Correction的Version 1块,有16个数据字和10个ECC字. So we start with an array of length 26, 前16个值是数据字, and the next 10 are set to 0.

显示/隐藏表6 -每个块的错误纠正码字

显示/隐藏表7 -生成器多项式

现在有一个过程我们要进行几次等于 data codewords in this block. 我们从数组中移除第一个元素, we'll call it A, 并在表5中找到对应的α指数, which we'll refer to as B. For the next C elements of the array, where C is the length of the generator, we add the generator numbers, in turn, to B. We'll call this sum D. 如果D大于255,用它除以255,取余数. Finally we find the value of αD ,并对数组中给定元素的当前值进行逐位异或运算. Confused? Me too. Let's look at an example.

假设我们有一个版本1的QR码,带有H纠错功能. 查看表6,我们看到我们将有17个ECC码字. Looking at Table 7, we see that means our generator is [43, 139, 206, 78, 43, 239, 123, 206, 214, 147, 24, 99, 150, 39, 243, 163, 136]. Let's pretend our data, 哪一个版本1与H错误纠正将是9个字长, is [32, 65, 205, 69, 41, 220, 46, 128, 236]. So our staring array looks like this:

32 65 205 69 41 220 46 128 236 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

We remove the first element of the array, 如果我们查找表5中的第一个值, we see that 32 is the 5th exponent of α. 因此,我们将我们的ECC编号加5,得到:

48 144 211 83 48 244 128 211 219 152 29 104 155 44 248 168 141

现在我们将α的指数转换为整数值,使用表4. 然后对每组值使用按位异或. 下表显示了原始值(在删除第一个元素之后),),然后是紧接前面列表的整数值(生成器编号+ 5),) and finally the result of the XOR mask.

65 205 69 41 220 46 128 236 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
70 168 178 187 70 250 133 178 86 73 48 13 114 238 27 252 21 - - - - - - - -
7 101 247 146 154 212 5 94 86 73 48 13 114 238 27 252 21 - - - - - - - -

因此,上表中的第三行是我们的新值数组. We see on Table 5 that 7 converts to 198, 因此,我们从新值数组中删除第一个元素(7), 然后给原来的生成式[43]中的每个元素加上198, 139, 206, 78, 43, 239, 123, 206, 214, 147, 24, 99, 150, 39, 243, 163, 136]. 然后我们再次将这些值转换为整数值,并应用另一个异或序列. 这样做了9次(对于我们的9个数据码字)之后,我们将得到一个长度为17个元素的值数组——这些是我们的错误纠正码字. 在本例中,我们的最终值如下:

42 159 74 221 244 169 239 150 138 70 237 85 224 96 74 219 61

编辑:感谢Erik指出了特殊情况,如果第一个元素是0, the bitmask is all 0s. 换句话说,该操作只是删除第一个元素(0),其他什么也不做.

显示/隐藏表8 -块和码字

编辑:我忘了解释一件非常重要的事情. 每个块由数据码字后跟纠错码字组成. So for the example above, 唯一一个用于1H的块将是我们的数据:[32, 65, 205, 69, 41, 220, 46, 128, 236], followed by our error correction: [42, 159, 74, 221, 244, 169, 239, 150, 138, 70, 237, 85, 224, 96, 74, 219, 61]. Since this symbol only has one block, 我们将这26个字节直接编码为二进制,并根据下一节中的规则放置它们. However, for symbols with more blocks, 实际上,我们按顺序对每个块的第一个码字进行编码, then the second, and so on. 所以两个区块的编码就像区块1编码字1, block 2 code word 1, block 1 code word 2, block 2 code word 2, etc. 在许多情况下,并不是所有的代码块都有完全相同的码字数量. 没关系,只是有些代码比其他代码长一个码字. 在其中一些耗尽之后,只需跳过它们并继续使用其他的过程.

到目前为止,纠错是二维码最复杂的部分,也是最容易出错的部分. 如果我还没有完全解释清楚,请留下评论,我会尽量解决它. 下周我们将开始在符号中放置数据,并应用蒙版. 如果你还没有读过之前的文章,一定要通读一遍 Part 1, Part 2, Part 3.

About Matcha Design
九游会客户端是一家专注于全方位服务的创意机构 web designprintidentitybrandinginterface designvideo productionstill photography and motion design. 用我们对卓越的热情,多元文化背景,和 award winning practices, we consistently provide high-quality, custom, 创新的解决方案,以满足客户多样化的营销需求. For more information, visit www.MatchaDesign.com.