数据编码
每种编码模式都使用不同的方法将文本转换为二进制数字,并且使用尽可能短的二进制数字来编码数据。
本文主要讲解二维码的详细编码过程。
1. 选择错误校正级别
在编码数据之前,首先应当选择错误校正级别。如前文中所述,二维码使用 里德-所罗门码。该过程基于编码数据创建纠错码,二维码阅读器可以使用这些纠错码来确定它是否正确地读取数据,并且可以使用纠错码来纠正错误。
二维码中有四种级别的纠错:L,M,Q,H。
下表列出了级别及其纠错能力:
注意: 更高级别的纠错需要更多的字节,因此纠错级别越高,二维码尺寸就越大。
2. 确定数据的最小版本
二维码一共有40个尺寸。官方叫版本Version。Version 1是21 x 21的矩阵,Version 2是 25 x 25的矩阵,Version 3是29的尺寸,每增加一个version,就会增加4的尺寸。
计算公式是:(V-1)*4 + 21(V是版本号)。
最高Version 40,(40-1)*4+21 = 177,所以最大是177 x 177 的正方形。
每个版本都有最大容量,具体取决于使用的模式。此外,纠错级别也进一步限制容量。
字符容量表列出了给定编码模式和纠错级别的所有二维码版本的容量。
2.1 如何确定最小的版本
计算要编码的字符数,并确定对应编码模式的包含的字符数量和符合纠错级别的最小版本。
举个栗子。
字符串 HELLO WORLD 有11个字符。 假设纠错级别为 Q。查看 字符容量表,发现版本1下纠错级别Q在字符模式下只能包含10个字符。因此,在这种情况下可以使用的最小版本是版本2。
2.2 最大限制
二维码的最高容量是40-L,Version 40 & Error correction level L。
下面的表格列出了40-L 二维码对应四种编码模式的容量。这是单个二维码可以包含的最大可能字符数。版本40-M,40-Q和40-H具有较低的容量,因为它们将更多的空间用于纠错码。
3 增加模式指示符
每个编码模式都具有指示它的四位模式指示符。编码数据必须以适当的模式指示符开始,用于指示后面的位串的模式。
举个栗子,如果以字符模式编码HELLO WORLD,模式指示符为0010。
下表列出了每种模式的模式指示符:
4 增加字符计数指示符
字符计数指示符是一串二进制数字(位串),表示正在编码的字符数。字符计数指示符必须放在模式指示符之后。此外,字符计数指示符有特定的位长,具体取决于二维码的版本和编码模式。
具体步骤是:
计算原始输入文本的字符数,将其转为二进制数字。根据版本和编码模式找到对应的位长,不够位长的在前面加0补齐。
举个栗子:
举个栗子,如果以字符模式编码HELLO WORLD,版本号为1,则字符计数指示符必须为9位长。
HELLO WORLD的字符数为11。在二进制中,11为1011。
在左侧填充0,使其长度达到9位:000001011。
将这个指示符放在模式指示符之后,获得以下位串:0010 000001011。
下表列出了每种版本的对应的字符计数指示符位长:
5 使用所选模式进行编码
上文数据分析中解释了如何为给定字符串选择适当的编码模式。点击下面的链接,了解每种模式的编码过程。
- 数字编码
- 字符编码
- 字节编码
- 日文编码
6 分成8位码字和添加补齐码(如果必要的话)
在获得由模式指示符,字符计数指示符和数据位组成的位串之后,可能需要添加0和补齐码,因为二维码规范要求位串必须完全填充二维码的总容量。
以下部分说明将0和补齐码添加到位串的过程。
6.1 确定此二维码所需的位数
要确定特定QR码需要多少数据位,请参阅 纠错表。
找到当前文本生成二维码所使用的版本和错误纠正级别,并在标有“数据码字总数”的对应列中找到该编号。将此数乘以8以获得此版本和纠错级别所需的数据位的总数。
例如,根据该表,二维码 1-Q 具有13个总数据码字。因此,该QR码所需的总比特数为13×8 = 104比特。
6.2 添加终止符(如有需要)
如果位串小于所需位的总数,则必须在字符串的右侧添加最多四个0的终止符。
如果所需位数比位串大四位及以上,则将四个0加到结尾。否则只添加达到所需位数所需的0的个数。
例如,如果在 1-Q 的二维码中编码HELLO WORLD,则所需比特的总数是104比特。而步骤五中HELLO WORLD数据位字符串为74位长。终止符的长度最多只能为4位,因此在字符串的右侧添加4个0。结果字符串仍然太短,无法填充104位容量,但二维码规范要求终止符的长度最多为4个0。如果字符串已经是102位,则终止符的长度将仅为2位。
下面是添加了终止符的HELLO WORLD字符串示例:
6.3 添加更多0,使长度为8的倍数
添加终止符后,如果字符串中的位数不是8的倍数,首先使用0来填充右侧的字符串,使字符串的长度为8的倍数。
例如,在将终止符添加到HELLO WORLD字符串之后,长度变为78位长。这不是8的倍数。位串显示为8位二进制字节:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 010000
最后有六位。添加两个0使其成为8位二进制字节:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000
6.4 如果字符串仍然太短,则添加补齐码(Pad Bytes)
如果字符串仍然不足以填充最大容量,请将以下字节添加到字符串的末尾,不断重复,直到字符串已达到最大长度:
11101100 00010001
这些字节分别等于236和17,二维码针对在6.3后字符串仍然太短的情况特别规定了补齐码(Pad Bytes)。
例如,上面的HELLO WORLD字符串为80位长。而1-Q二维码所需的容量为104位。
需要填充的位数为104 - 80 = 24.
将它除以8:24/8 = 3.
因此,必须将三个填充字节添加到数据字符串的末尾。如下所示:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000 11101100 00010001 11101100
下一节: >> 生成纠错码