每种编码模式都旨在为该模式下使用的字符创建尽可能短的位字符串。每种模式都使用不同的方法将输入文本转换为位字符串。本页介绍整个数据编码步骤。
步骤1:选择纠错级别
在对数据进行编码之前,请选择纠错级别。如介绍中所述,二维码使用里德-所罗门纠错 (Reed-Solomon error correction)。此过程根据编码的数据创建纠错码字(字节)。二维码阅读器可以使用这些纠错字节来确定它是否未正确读取数据,并且纠错码字可用于更正这些错误。纠错有四个级别:L、M、Q、H。下表列出了这些级别及其纠错功能。
纠错级别 | 纠错能力 |
L | 恢复 7% 的数据 |
M | 恢复 15% 的数据 |
Q | 恢复 25% 的数据 |
H | 恢复 30% 的数据 |
请注意,更高级别的纠错需要更多的字节,因此纠错级别越高,二维码必须越大。
步骤 2:确定数据的最小版本
不同大小的二维码称为版本(Version)。有四十个版本可用。最小版本是版本 1,大小为 21 x 21 像素。版本 2 为 25 x 25 像素。最大的版本是版本 40,大小为 177 x 177 像素。后一个版本都比前一个的版本大 4 个像素。
每个版本都有最大容量,具体取决于使用的模式。此外,纠错级别进一步限制了容量。字符容量表列出了给定编码模式和纠错级别的所有二维码版本的容量。
按版本、模式和纠错划分的字符容量如何确定最小版本
此时,计算要编码的字符数,并确定哪个版本可以包含编码模式和所需纠错级别的字符数。
例如,短语 HELLO WORLD 有 11 个字符。如果使用 Q 级纠错进行编码,则字符容量表表示,使用级别 Q 纠错的版本 1 代码在字母数字模式下可以包含 16 个字符,因此版本 1 是可以包含此字符数的最小版本。如果短语长度超过 16 个字符,例如 HELLO THERE WORLD(即 17 个字符),则版本 2 将是最小的版本。
上限
最高容量二维码为 40-L(版本 40,纠错级别 L)。下表列出了四种编码模式下 40-L QR 码的容量。这是单个 QR 码可以包含的最大可能字符数。版本 40-M、40-Q 和 40-H 的容量较低,因为它们需要更多空间来容纳更多的纠错码字。有关所有版本的容量表,请参阅字符容量表。
编码模式 | 在该模式下,40-L 模式可以包含的最大字符数 |
数字 | 7089 个字符 |
字符 | 4296 个字符 |
字节 | 2953 个字符 |
日文汉字 | 1817 个字符 |
第 3 步:添加模式指示标志
每种编码模式都有一个四位模式指示标志来标识它。编码数据必须以适当的模式指示标志开头,该指示标志指定用于其后位的模式。下表列出了每种模式的模式指示标志。
例如,如果在字母数字模式下编码 HELLO WORLD,则模式指示标志为 0010。
模式名称 | 模式指示标志 |
数字模式 | 0001 |
字符模式 | 0010 |
字节模式 | 0100 |
日文汉字模式 | 1000 |
ECI 模式 | 0111 |
步骤 4:添加字符计数指示标志
字符计数指示标志是一个位字符串,表示正在编码的字符数。字符计数指示标志必须放在模式指示标志之后。此外,字符计数指示标志必须具有一定数量的位长,具体取决于二维码版本。
计算原始输入文本中的字符数,然后将该数字转换为二进制。字符计数指示标志的长度取决于编码模式和将使用的二维码版本。若要使二进制字符串具有适当的长度,请在左侧用 0 填充它。
以下列表包含每种模式和版本的字符计数指示标志的大小。例如,如果在字符模式下将 HELLO WORLD 编码为版本 1 的 二维码,则字符计数指示标志的长度必须为 9 位。HELLO WORLD 的字符数是11。在二进制中,11 是 1011。将其填充在左侧以使其长度为 9 位:000001011。之后将字符计数指示标志放在步骤 3 中的模式指示标志之后,得到以下位字符串:0010 000001011
版本 1 到 9
- 数字模式:10 位
- 字符模式:9 位
- 字节模式:8位
- 日文汉字模式:8位
版本 10 到 26
- 数字模式:12 位
- 字符模式:11 位
- 字节模式:16 位
- 日文汉字模式:10位
版本 27 到 40
- 数字模式:14位
- 字符模式:13位
- 字节模式:16位
- 日文汉字模式:12位
步骤 3:使用所选模式进行编码
上一部分数据分析说明了如何为给定字符串选择适当的编码模式。每种编码模式的过程在其自己的页面上进行了说明。单击下面的链接以阅读每种模式的编码过程。
数字模式编码字符模式编码字节模式编码日文汉字模式编码HELLO WORLD 在字符模式编码页面上进行编码。继续 HELLO WORLD 示例,到目前为止的位字符串是:
模式指示标志 | 字符计数指示标志 | 编码数据 |
0010 | 000001011 | 01100001011 01111000110 10001011100 10110111000 10011010100 001101 |
步骤 4:分解为 8 位码字并在必要时添加填充字节
如本页步骤 1 到 3 所述,获取由模式指示标志、字符计数指示标志和数据位组成的一串二进制位后,可能需要添加 0 和填充字节,因为二维码规范要求位字符串必须完全填充二维码的总容量。以下部分介绍向位字符串添加 0 和填充字节的过程。
确定此二维码所需的位数
要确定特定二维码需要多少数据位,请参阅纠错表。查找用于编码的二维码的版本和纠错级别,并在标记为“此版本和 EC 级别的数据码字总数”的列中找到数字。将此数字乘以 8 得到此版本和纠错级别所需的数据位总数。
纠错码字和块信息例如,根据该表,版本 1-Q 代码总共有 13 个数据码字。因此,此QR码所需的总位数为13 × 8,即104位。
如有必要,添加终止符 0
如果位串短于所需的总位数,则必须在位串的右侧添加一个最多四个0的终止符。如果位串比所需的位数短4位以上,则在结尾处加4个0。如果位串短于四个位,只需添加达到所需位数的0的数量。
例如,如果在版本 1-Q 二维码中编码 HELLO WORLD,则上一节中提到的所需位总数为 104 位。此页上的步骤 3 中显示的数据位字符串长度为 74 位。终止符最多只能只有 4 位长,因此在字符串右侧添加四个 0。生成的字符串仍然太短,无法填充 104 位容量,但二维码规范要求终止符的长度最多为 4 个 0。如果字符串是 102 位,则终止符的长度只有 2 位。
下面是添加了终止符的示例 HELLO WORLD 字符串:
模式指示标志 | 字符计数指示标志 | 编码数据 | 终止符 |
0010 | 000001011 | 01100001011 01111000110 10001011100 10110111000 10011010100 001101 | 0000 |
添加更多 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
如果字符串仍然太短,则添加填充字节
如果字符串仍然不够长,无法填满最大容量,请将以下字节添加到字符串的末尾,重复直到字符串达到最大长度:11101100 00010001
这些字节分别相当于 236 和 17。如果此阶段位字符串太短,则二维码规范特别要求添加它们。
例如,上面的 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
下一篇: 纠错编码
现在已经获得了原始数据位,下一步是为数据生成纠错码字。