二维码的工作原理是什么( 二 )


5. 把字符的个数转成二进制 (Version 1-H为9 bits ): 5个字符 , 5转成 000000101
6. 在头上加上编码标识 0010 和第5步的个数编码: 0010 000000101 00111001110 11100111001 000010
结束符和补齐符
假如我们有个HELLO WORLD的字符串要编码 , 根据上面的示例二 , 我们可以得到下面的编码 , 
编码
字符数
HELLO WORLD的编码
0010 000001011 01100001011 01111000110 10001011100 10110111000 10011010100 001101
我们还要加上结束符:
编码
字符数
HELLO WORLD的编码
结束
0010 000001011 01100001011 01111000110 10001011100 10110111000 10011010100 001101 0000
按8bits重排
如果所有的编码加起来不是8个倍数我们还要在后面加上足够的0 , 比如上面一共有78个bits,所以,我们还要加上2个0,然后按8个bits分好组:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000
最后,如果如果还没有达到我们最大的bits数的限制,我们还要加一些,Padding Bytes就是重复下面的两个bytes:11101100 00010001 (这两个二进制转成十进制是236和17 , 我也不知道为什么,只知道Spec上是这么写的)关于每一个Version的每一种纠错级别的最大Bits限 制,可以参看QR Code Spec的第28页到32页的Table-7一表 。
假设我们需要编码的是Version 1的Q纠错级 , 那么,其最大需要104个bits,而我们上面只有80个bits,所以,还需要24个bits , 也就是需要3个Padding Bytes , 我们就添加三个,于是得到下面的编码:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000 11101100 00010001 11101100
纠错码
上面我们说到了一些纠错级别,Error Correction Code Level,二维码中有四种级别的纠错,这就是为什么二维码有残缺还能扫出来,也就是为什么有人在二维码的中心位置加入图标 。
错误修正容量
L水平 7%的字码可被修正
M水平 15%的字码可被修正
Q水平 25%的字码可被修正
H水平 30%的字码可被修正
那么,QR是怎么对数据码加上纠错码的?首先,我们需要对数据码进行分组,也就是分成不同的Block,然后对各个Block进行纠错编码 , 对于如何分组,我们可以查看QR Code Spec的第33页到44页的Table-13到Table-22的定义表 。注意最后两列:
Number of Error Code Correction Blocks :需要分多少个块 。
Error Correction Code Per Blocks:每一个块中的code个数,所谓的code的个数,也就是有多少个8bits的字节 。
【二维码的工作原理是什么】

二维码的工作原理是什么

文章插图
举个例子:上述的Version 5 + Q纠错级:需要4个Blocks(2个Blocks为一组,共两组) , 头一组的两个Blocks中各15个bits数据 + 各 9个bits的纠错码(注:表中的codewords就是一个8bits的byte)(再注:最后一例中的(c, k, r )的公式为:c = k + 2 * r , 因为后脚注解释了:纠错码的容量小于纠错码的一半)
对每个块的纠错码
1 1 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
2 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 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 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
注:二维码的纠错码主要是通过Reed-Solomon error correction(里 德-所罗门纠错算法)来实现的 。对于这个算法,对于我来说是相当的复杂,里面有很多的数学计算,最终编码 。
穿插放置
二维码的混乱技术还没有玩完,它还要把数据码和纠错码的各个codewords交替放在一起 。如何交替呢,规则如下:
对于数据码:把每个块的第一个codewords先拿出来按顺度排列好,然后再取第一块的第二个,如此类推 。如:上述示例中的Data Codewords如下:
块 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
我们先取第一列的:67, 246,182 ,  70
然后再取第二列的:67,246,182,70, 85,246,230,247
如此类推:67,246,182 ,  70,85,246 , 230,247 ……… ………,38,6 , 50,17,7,236


推荐阅读