在纠错编码部分,解释了里德-所罗门纠错过程。您现在应该拥有数据码字及其相应的纠错码字。如上一步所述,较大的二维码需要您将数据码字分解为较小的块,并为每个块分别生成纠错码字。在这种情况下,数据块和纠错码字必须根据二维码规范交错。本页详细介绍了交错过程。
步骤 1:确定需要多少块和纠错码字
纠错表显示每个版本和纠错级别需要多少个数据块和每个块的纠错码字。
对于较小的代码,请按原样使用数据和纠错码字
请注意,较小的二维码仅包含一个数据码字块,该块有一组纠错码字。在这种情况下,不需要交错。只需将纠错码字放在数据码字之后,然后继续下一步,在矩阵中放置模块。
分解较大的二维码
在纠错编码页面上,我展示了一个使用 5-Q 代码的示例。纠错表显示,5-Q码的第一组由2个块组成,每个块有15个数据码字,第二组由2个块组成,每个块有16个数据码字。这里再次是纠错编码页面上显示的表格,其中显示了将 5-Q 代码分解为组和块。
组号 | 区块编号 | 组中的数据码字 |
第 1 组 | 区块 1 | (码字#1) 01000011
(码字#2) 01010101
(码字#3) 01000110
(码字#4) 10000110
(码字#5) 01010111
(码字#6) 00100110
(码字#7) 01010101
(码字#8) 11000010
(码字#9) 01110111
(码字#10) 00110010
(码字#11) 00000110
(码字#12) 00010010
(码字#13) 00000110
(码字#14) 01100111
(码字#15) 00100110 |
第 1 组 | 区块 2 | (码字#16) 11110110
(码字#17) 11110110
(码字#18) 01000010
(码字#19) 00000111
(码字#20) 01110110
(码字#21) 10000110
(码字#22) 11110010
(码字#23) 00000111
(码字#24) 00100110
(码字#25) 01010110
(码字#26) 00010110
(码字#27) 11000110
(码字#28) 11000111
(码字#29) 10010010
(码字#30) 00000110 |
第 2 组 | 区块 1 | (码字#31) 10110110
(码字#32) 11100110
(码字#33) 11110111
(码字#34) 01110111
(码字#35) 00110010
(码字#36) 00000111
(码字#37) 01110110
(码字#38) 10000110
(码字#39) 01010111
(码字#40) 00100110
(码字#41) 01010010
(码字#42) 00000110
(码字#43) 10000110
(码字#44) 10010111
(码字#45) 00110010
(码字#46) 00000111 |
第 2 组 | 区块 2 | (码字#47) 01000110
(码字#48) 11110111
(码字#49) 01110110
(码字#50) 01010110
(码字#51) 11000010
(码字#52) 00000110
(码字#53) 10010111
(码字#54) 00110010
(码字#55) 11100000
(码字#56) 11101100
(码字#57) 00010001
(码字#58) 11101100
(码字#59) 00010001
(码字#60) 11101100
(码字#61) 00010001
(码字#62) 11101100 |
请注意,纠错表指出,对于每个块,5-Q 代码必须具有 18 个纠错码字。现在已经解释了纠错编码,可以计算出上述数据的纠错码字。
有四个块,因此应生成四组 18 个纠错码字。下面是一个更新的表格,显示了每个块转换为整数列表的数据更正码字,以及为每个块生成的 18 个纠错码字。
组号 | 区块编号 | 组中的数据码字 | 作为整数的数据码字以及块的纠错码字 |
第 1 组 | 区块 1 | (码字#1) 01000011
(码字#2) 01010101
(码字#3) 01000110
(码字#4) 10000110
(码字#5) 01010111
(码字#6) 00100110
(码字#7) 01010101
(码字#8) 11000010
(码字#9) 01110111
(码字#10) 00110010
(码字#11) 00000110
(码字#12) 00010010
(码字#13) 00000110
(码字#14) 01100111
(码字#15) 00100110 | 数据码字从左起,
整数:67,85,70,134,87,38,85,194,119,50,6,18,6,103,38
纠错码字(显示这些是如何计算的):213 199 11 45 115 247 241 223 229 248 154 117 154 111 86 161 111 39 |
第 1 组 | 区块 2 | (码字#16) 11110110
(码字#17) 11110110
(码字#18) 01000010
(码字#19) 00000111
(码字#20) 01110110
(码字#21) 10000110
(码字#22) 11110010
(码字#23) 00000111
(码字#24) 00100110
(码字#25) 01010110
(码字#26) 00010110
(码字#27) 11000110
(码字#28) 11000111
(码字#29) 10010010
(码字#30) 00000110 | 数据码字从左起,
整数:246,246,66,7,118,134,242,7,38,86,22,198,199,146,6
纠错码字(显示这些是如何计算的):87 204 96 60 202 182 124 157 200 134 27 129 209 17 163 163 120 133 |
组 2 | 区块 1 | (码字#31) 10110110
(码字#32) 11100110
(码字#33) 11110111
(码字#34) 01110111
(码字#35) 00110010
(码字#36) 00000111
(码字#37) 01110110
(码字#38) 10000110
(码字#39) 01010111
(码字#40) 00100110
(码字#41) 01010010
(码字#42) 00000110
(码字#43) 10000110
(码字#44) 10010111
(码字#45) 00110010
(码字#46) 00000111 | 数据码字从左起,
整数:182,230,247,119,50,7,118,134,87,38,82,6,134,151,50,7
纠错码字(显示这些是如何计算的):148 116 177 212 76 133 75 242 238 76 195 230 189 10 108 240 192 141 |
ㅤ | 区块 2 | (码字#47) 01000110
(码字#48) 11110111
(码字#49) 01110110
(码字#50) 01010110
(码字#51) 11000010
(码字#52) 00000110
(码字#53) 10010111
(码字#54) 00110010
(码字#55) 11100000
(码字#56) 11101100
(码字#57) 00010001
(码字#58) 11101100
(码字#59) 00010001
(码字#60) 11101100
(码字#61) 00010001
(码字#62) 11101100 | 数据码字从左起,
整数:70,247,118,86,194,6,151,50,16,236,17,236,17,236,17,236
纠错码字(显示这些是如何计算的):235 159 5 173 24 147 59 33 106 40 255 172 82 2 131 32 178 236 |
现在,已经计算了数据的纠错码字,下一节将解释交错数据块和纠错码字的过程。
步骤 2:交错块
通过执行以下操作来交错块:
- 从第一个块中获取第一个数据码字
- 后跟第二个块中的第一个数据码字
- 后跟第三个块中的第一个数据码字
- 后跟第四个块中的第一个数据码字
- 后跟第一个块中的第二个数据码字
- ……
不断重复这种模式,穿过各个区块,直到所有的数据码字都被交织在一起。
之后,执行以下操作:
- 从第一个块中获取第一个纠错码字
- 后跟第二个块中的第一个纠错码字
- 后跟第三个块中的第一个纠错码字
- 后跟第四块中的第一个纠错码字
- 后跟第一个块中的第二个纠错码字
- …..
执行此操作,直到所有纠错码字都用完为止。
此过程详述如下。
交错数据码字
交错数据码字的过程用下表和说明进行了说明。
ㅤ | 第 1 列 | 第 2 列 | 第 3 列 | 第 4 列 | 第 5 列 | 第 6 列 | 第 7 列 | 第 8 列 | 第 9 列 | 第 10 列 | 第 11 列 | 第 12 列 | 第 13 列 | 第 14 列 | 第 15 列 | 第 16 列 |
区块 1 | 67 | 85 | 70 | 134 | 87 | 38 | 85 | 194 | 119 | 50 | 6 | 18 | 6 | 103 | 38 | ㅤ |
区块 2 | 246 | 246 | 66 | 7 | 118 | 134 | 242 | 7 | 38 | 86 | 22 | 198 | 199 | 146 | 6 | ㅤ |
区块 3 | 182 | 230 | 247 | 119 | 50 | 7 | 118 | 134 | 87 | 38 | 82 | 6 | 134 | 151 | 50 | 7 |
区块 4 | 70 | 247 | 118 | 86 | 194 | 6 | 151 | 50 | 16 | 236 | 17 | 236 | 17 | 236 | 17 | 236 |
如上所述,从第一个块中获取第一个数据码字,然后从第二个块中获取第一个数据码字,然后从第三个块中获取第一个数据码字,然后从第四块中获取第一个数据码字。
或者,如上表所示,从第 1 列中获取数据码字,从块 1 开始,到块 4 结束。第 1 列中的数字是 67、246、182 和 70。
到目前为止的交错数据:67, 246, 182, 70
之后,输入第 2 列中的数字,从块 1 开始,到块 4 结束。
到目前为止的交错数据:67, 246, 182, 70, 85, 246, 230, 247
对第 3 列执行相同的操作。
交错数据:67, 246, 182, 70, 85, 246, 230, 247, 70, 66, 247, 118
重复该过程,逐列进行。这是添加第 15 列后的结果。
加入第15列后的交错数据:
67, 246, 182, 70, 85, 246, 230, 247, 70, 66, 247, 118, 134, 7, 119, 86, 87, 118, 50, 194, 38, 134, 7, 6, 85, 242, 118, 151, 194, 7, 134, 50, 119, 38, 87, 16, 50, 86, 38, 236, 6, 22, 82, 17, 18, 198, 6, 236, 6, 199, 134, 17, 103, 146, 151, 236, 38, 6, 50, 17
第 16 列中只有两个数字,如上表所示。只需将这两个数字放在交错数据的末尾,如下所示:
交错数据码字:67, 246, 182, 70, 85, 246, 230, 247, 70, 66, 247, 118, 134, 7, 119, 86, 87, 118, 50, 194, 38, 134, 7, 6, 85, 242, 118, 151, 194, 7, 134, 50, 119, 38, 87, 16, 50, 86, 38, 236, 6, 22, 82, 17, 18, 198, 6, 236, 6, 199, 134, 17, 103, 146, 151, 236, 38, 6, 50, 17, 7, 236
交错纠错码字
现在数据码字已经交错,纠错码字应该交错。下表和说明说明了此过程。
ㅤ | 第 1 列 | 第 2 列 | 第 3 列 | 第 4 列 | 第 5 列 | 第 6 列 | 第 7 列 | 第 8 列 | 第 9 列 | 第 10 列 | 第 11 列 | 第 12 列 | 第 13 列 | 第 14 列 | 第 15 列 | 第 16 列 | 第 17 列 | 第 18 列 |
区块 1 | 213 | 199 | 11 | 45 | 115 | 247 | 241 | 223 | 229 | 248 | 154 | 117 | 154 | 111 | 86 | 161 | 111 | 39 |
区块 2 | 87 | 204 | 96 | 60 | 202 | 182 | 124 | 157 | 200 | 134 | 27 | 129 | 209 | 17 | 163 | 163 | 120 | 133 |
区块 3 | 148 | 116 | 177 | 212 | 76 | 133 | 75 | 242 | 238 | 76 | 195 | 230 | 189 | 10 | 108 | 240 | 192 | 141 |
区块 4 | 235 | 159 | 5 | 173 | 24 | 147 | 59 | 33 | 106 | 40 | 255 | 172 | 82 | 2 | 131 | 32 | 178 | 236 |
如上所述,取来自第一块的第一个纠错码字,然后从第二块取第一个纠错码字,然后从第三块取第一个纠错码字,然后从第四块取第一个纠错码字。或者,如上表所示,从第 1 列中获取纠错码字,从块 1 开始,到块 4 结束。第 1 列中的数字是 213、87、148 和 235。
交错纠错码字:213, 87, 148, 235
之后,输入第 2 列中的数字,从块 1 开始,到块 4 结束。
到目前为止的交错纠错码字:213, 87, 148, 235, 199, 204, 116, 159
对第 3 列执行相同的操作。
到目前为止的交错纠错码字:213, 87, 148, 235, 199, 204, 116, 159, 11, 96, 177, 5
重复该过程,逐列进行。这是最终结果。
交错纠错码字:213, 87, 148, 235, 199, 204, 116, 159, 11, 96, 177, 5, 45, 60, 212, 173, 115, 202, 76, 24, 247, 182, 133, 147, 241, 124, 75, 59, 223, 157, 242, 33, 229, 200, 238, 106, 248, 134, 76, 40, 154, 27, 195, 255, 117, 129, 230, 172, 154, 209, 189, 82, 111, 17, 10, 2, 86, 163, 108, 131, 161, 163, 240, 32, 111, 120, 192, 178, 39, 133, 141, 236
将交错纠错码字放在交错数据码字之后
最后一条信息由交错数据码字后跟交错纠错码字组成。
最终的消息:
67, 246, 182, 70, 85, 246, 230, 247, 70, 66, 247, 118, 134, 7, 119, 86, 87, 118, 50, 194, 38, 134, 7, 6, 85, 242, 118, 151, 194, 7, 134, 50, 119, 38, 87, 16, 50, 86, 38, 236, 6, 22, 82, 17, 18, 198, 6, 236, 6, 199, 134, 17, 103, 146, 151, 236, 38, 6, 50, 17, 7, 236, 213, 87, 148, 235, 199, 204, 116, 159, 11, 96, 177, 5, 45, 60, 212, 173, 115, 202, 76, 24, 247, 182, 133, 147, 241, 124, 75, 59, 223, 157, 242, 33, 229, 200, 238, 106, 248, 134, 76, 40, 154, 27, 195, 255, 117, 129, 230, 172, 154, 209, 189, 82, 111, 17, 10, 2, 86, 163, 108, 131, 161, 163, 240, 32, 111, 120, 192, 178, 39, 133, 141, 236
第 3 步:转换为二进制
最后一条消息将转换为 8 位二进制文件。在我们的示例中,前四个码字是 67、246、182 和 70。转换为二进制,它们是:
67 = 01000011246 = 11110110182 = 1011011070 = 01000110
8 位二进制数放在一个不间断的字符串中。使用上面的前四个码字,最终消息的前 32 位是:
01000011111101101011011001000110
为了完整起见,二进制格式的整个最终消息位于折叠块内部:
0100001111110110101101100100011001010101111101101110011011110111010001100100001011110111011101101000011000000111011101110101011001010111011101100011001011000010001001101000011000000111000001100101010111110010011101101001011111000010000001111000011000110010011101110010011001010111000100000011001001010110001001101110110000000110000101100101001000010001000100101100011000000110111011000000011011000111100001100001000101100111100100101001011111101100001001100000011000110010000100010000011111101100110101010101011110010100111010111100011111001100011101001001111100001011011000001011000100000101001011010011110011010100101011010111001111001010010011000001100011110111101101101000010110010011111100010111110001001011001110111101111110011101111100100010000111100101110010001110111001101010111110001000011001001100001010001001101000011011110000111111111101110101100000011110011010101100100110101101000110111101010100100110111100010001000010100000001001010110101000110110110010000011101000011010001111110000001000000110111101111000110000001011001000100111100001011000110111101100
步骤 4:如有必要,添加余数位
对于某些二维码版本,最终的二进制消息不够长,无法填充所需的位数。在这种情况下,有必要在最终消息的末尾添加一定数量的 0,以使其具有正确的长度。这些额外的 0 称为余数位。版本 5 的二维码(如本例中的二维码)必须在末尾添加 7 个剩余位。
上面文本框中字符串的最后 8 位是:11101100
将剩余的 7 个位添加到末尾,字符串的最后位是:111011000000000
为了完整起见,二进制的整个最后一条消息,加上 7 个余数位,位于折叠块内部:
01000011111101101011011001000110010101011111011011100110111101110100011001000010111101110111011010000110000001110111011101010110010101110111011000110010110000100010011010000110000001110000011001010101111100100111011010010111110000100000011110000110001100100111011100100110010101110001000000110010010101100010011011101100000001100001011001010010000100010001001011000110000001101110110000000110110001111000011000010001011001111001001010010111111011000010011000000110001100100001000100000111111011001101010101010111100101001110101111000111110011000111010010011111000010110110000010110001000001010010110100111100110101001010110101110011110010100100110000011000111101111011011010000101100100111111000101111100010010110011101111011111100111011111001000100001111001011100100011101110011010101111100010000110010011000010100010011010000110111100001111111111011101011000000111100110101011001001101011010001101111010101001001101111000100010000101000000010010101101010001101101100100000111010000110100011111100000010000001101111011110001100000010110010001001111000010110001101111011000000000
请参阅下表,其中列出了每个二维码版本所需的余数位数。
现在已经确定了最终的二进制字符串,下一步是将数据位和函数模式放置在二维码矩阵中。此过程在矩阵中的模块放置部分中进行了说明。
版本列表和所需的余数位
下表列出了 40 个二维码版本以及必须添加到最终消息字符串末尾的余数位数。请注意,无论使用哪个纠错级别,都需要为每个版本指定的余数位。另请注意,某些版本(如版本 7 到 13)不需要添加任何余数位。
二维码版本 | 所需的余数位 |
1 | 0 |
2 | 7 |
3 | 7 |
4 | 7 |
5 | 7 |
6 | 7 |
7 | 0 |
8 | 0 |
9 | 0 |
10 | 0 |
11 | 0 |
12 | 0 |
13 | 0 |
14 | 3 |
15 | 3 |
16 | 3 |
17 | 3 |
18 | 3 |
19 | 3 |
20 | 3 |
21 | 4 |
22 | 4 |
23 | 4 |
24 | 4 |
25 | 4 |
26 | 4 |
27 | 4 |
28 | 3 |
29 | 3 |
30 | 3 |
31 | 3 |
32 | 3 |
33 | 3 |
34 | 3 |
35 | 0 |
36 | 0 |
37 | 0 |
38 | 0 |
39 | 0 |
40 | 0 |
下一步
如上所述,下一步是在矩阵中放置模块。本节介绍如何放置所有二维码所需的数据位以及功能模式。