格式和版本信息b
创建二维码的最后一步是创建格式和版本字符串,然后将它们放置在 QR 码中的正确位置。本页介绍如何生成格式和版本字符串,并说明它们在 QR 码中的位置。
格式化字符串
格式信息字符串对当前二维码中使用的纠错级别和掩码模式进行编码。由于有四种可能的纠错级别(L、M、Q 和 H)和八种可能的掩码模式,因此有 32(4 乘以 8)种可能的格式信息字符串。下一节介绍如何生成这些格式字符串。有关 32 种格式字符串的完整列表,请参阅格式和版本字符串表。
格式和版本字符串表生成格式字符串
格式字符串的长度始终为 15 位。要创建字符串,请首先创建一个五位字符串,用于编码此二维码中使用的纠错级别和掩码图案。然后,使用这五个位生成十个纠错位。得到的15位与掩码图案101010000010010 进行异或运算。下面将详细解释此过程。
纠错位
创建格式字符串的第一步是获取指定二维码中使用的纠错级别的两个位。下表显示了每个纠错级别的位序列。
纠错级别 | 位 | 整数 |
L | 01 | 1 |
M | 00 | 0 |
Q | 11 | 3 |
H | 10 | 2 |
请注意,数字在表中不按 0、1、2、3 的顺序排列。
掩码图案位
有关掩码图案,请参阅二维码掩码图案页面以查找每个图案附带的掩码编号。将数字转换为三位二进制字符串。
示例五位格式字符串
例如,如果我们使用了纠错级别 L 和掩码模式 4,则创建五位二进制序列如下:
01(纠错级别 L)100(二进制表示 4,即掩码模式 4)
结果:01100
为格式字符串生成纠错位
现在我们有五个位用于格式字符串,我们必须使用它来生成十个纠错位。此步骤使用里德-所罗门纠错,但它稍微容易一些,因为在这种情况下,多项式包含的项不超过十五个,并且它们的系数都是 1 或 0。
获取生成器多项式
在生成格式字符串的纠错码字时,二维码规范说使用以下生成器多项式:
我们可以通过仅取每个项的系数将其转换为二进制字符串。 的系数为 1, 的系数为 0,因为多项式中不存在 ,依此类推。
换句话说,表示此步骤的生成器多项式的二进制字符串是 10100110111
计算纠错位
下一步是将格式字符串位(上一步中的 01100)除以生成器多项式(上一步中的 10100110111)。
为此,首先通过在格式字符串的右侧放置十个 15 来创建 0 位字符串,如下所示:
01100 -> 011000000000000
现在从左侧删除任何 0:
011000000000000 -> 11000000000000
现在我们执行除法。步骤(下面将更详细地描述)是:
- 用0填充右边的生成器多项式字符串,使其与当前格式字符串的长度相同。
- 将填充好的生成器多项式字符串与当前的格式字符串进行XOR。
- 从结果的左边去除0。
我们必须对多项式进行除法,直到生成的格式字符串长度为 10 位或更少。因此,在每个除法步骤之前,请检查以确保当前格式字符串为 11 位或更长(11 位是生成器多项式的长度)。我们当前的字符串 11000000000000 的长度为 14 位。
第一次除法过程
首先,用 0 填充右侧的生成器多项式字符串,使其与当前格式字符串的长度相同:
10100110111 11000000000000 10100110111000
现在,异或格式字符串与填充生成器多项式:
11000000000000 ^ 10100110111000 = 01100110111000
并从结果左侧删除 0:
01100110111000 -> 1100110111000
第二次除法过程
生成的字符串1100110111000长度为 13 位,因此由于长度为 11 位或更长,因此我们可以继续。
填充右侧的生成器多项式,使长度与当前格式字符串相同:
10100110111 1100110111000 1010011011100
将当前格式字符串与填充的生成器多项式进行XOR:
1100110111000 ^ 1010011011100 = 110101100100
第三次除法过程
生成的字符串110101100100长度为 12 位,因此由于长度为 11 位或更长,因此我们可以继续。
填充右侧的生成器多项式,使长度与当前格式字符串相同:
10100110111 110101100100 101001101110
将当前格式字符串与填充的生成器多项式进行XOR:
110101100100 ^ 101001101110 = 011100001010
并从结果左侧删除 0:
011100001010 -> 11100001010
第四次除法过程
生成的字符串11100001010长度为 11 位,因此由于长度为 11 位或更长,因此我们可以继续。
无需填充生成器多项式,因为格式字符串现在的长度相同。
异或当前格式字符串与生成器多项式:
11100001010 ^ 10100110111 = 1000111101
结果是10比特长,所以我们完成了除法步骤。如果结果小于10比特,我们就在左边用0来填充,使其变成10比特长。
将格式和纠错位放在一起
使用格式信息的原始五位(纠错级别指示器和掩码模式指示器)创建一个字符串,然后是刚刚生成的纠错位。
五位格式字符串:01100
除法步骤中的十位纠错字符串:1000111101
组合字符串:011001000111101
与掩码字符串进行XOR
二维码规范说,将结果与以下二进制字符串进行XOR:101010000010010
011001000111101 ^ 101010000010010 = 110011000101111
纠错级别为 L 和掩码模式 4 的代码的最终格式字符串:110011000101111
有关所有 32 个格式字符串的列表,请参阅格式字符串表。
将格式字符串放入二维码中
格式信息字符串放置在最上面的查找器图案下方和最左侧查找器图案的右侧,如下图所示。图像中的数字 0 表示格式字符串的最高有效位,数字 14 表示最低有效位。 换句话说,使用上面示例中的格式字符串110011000101111,下图中的数字对应于格式字符串位,如下所示:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 |
![notion image](https://www.thonky.com/qr-code-tutorial/format-layout.png?a=&t=77402d72-710e-4193-8a8a-333ae8003acf)
下图显示了版本1 二维码中的示例格式字符串 110011000101111
![notion image](https://www.thonky.com/qr-code-tutorial/example-format.png?t=19282203-9cbb-4c3a-90a4-06deb9344894)
暗模块
每个二维码都必须有一个深色像素,也称为暗模块,坐标(8,4 *版本 + 9)。也就是说,暗模块的y坐标为
版本1:4*1+9=13
版本2:4*2+9=17
版本3:4*3+9=21
以此类推
这意味着暗模块始终位于左下角查找器图案右上角的右侧。如下图所示。
![notion image](https://www.thonky.com/qr-code-tutorial/function-patterns.png?t=f1fd774a-7f75-4e40-aa05-43855ef5531d)
对于更大的二维码
无论二维码的大小如何,格式字符串位都放置在最上面的查找器图案下方和最左侧查找器图案的右侧,如下图所示。请注意,这两个图像具有与本页前面的示例相同的格式字符串(110011000101111)。格式字符串以红色突出显示,定位图案和暗模块以蓝色突出显示。
![notion image](https://www.thonky.com/qr-code-tutorial/format-position-1.png?t=eafeadc6-2c83-424b-be60-b16ffaadcf51)
![notion image](https://www.thonky.com/qr-code-tutorial/format-position-2.png?t=ad017ea3-b0f7-49ee-9c2a-4628dc4c2292)
版本信息
如果二维码版本为 7 或更高版本,则必须在二维码的左下角和右上角包含 18 位版本信息字符串。(有关所有可能的版本信息字符串的完整列表,请参阅格式和版本表。版本信息区域是下图中显示的 6x3 蓝色矩形。无论二维码有多大,版本信息都放置在查找器图案旁边。左图为版本7二维码,右图为版本22二维码。
![notion image](https://www.thonky.com/qr-code-tutorial/version-location-1.png?t=9644bcbd-572b-435d-8e71-4604ea36c8cd)
![notion image](https://www.thonky.com/qr-code-tutorial/version-location-2.png?t=edead0c2-cc21-4d9c-bbc1-d998f308f505)
生成版本信息字符串
二维码规范说使用(18,6)戈莱码作为版本信息字符串。因此,版本信息字符串是一个18位的字符串,由一个编码二维码版本的6位二进制字符串组成,后面是一串12位的纠错位。整个字符串的长度为18位。
获取生成器多项式
二维码规范说在此步骤中使用以下生成器多项式:
如本页前面的格式字符串部分所述,我们可以使用以下二进制字符串表示此生成器多项式:
1111100100101
执行除法
从这里,我们可以按照用于生成格式信息字符串的相同除法步骤进行操作,除了在这种情况下,我们将初始字符串填充为 18 位而不是 15 位长,并且当当前位字符串长度为 12 位或更少时停止,而不是 10 位或更少。
首先创建一个表示版本号的六位二进制字符串。例如,对于版本 7 二维码,7 的六位二进制等效项为:000111
通过在右边填充0,将其变成一个18位的字符串。
000111000000000000
并从左侧删除 0:
111000000000000
现在用 0 填充右侧的生成器多项式以使其长度相同:
111000000000000 1111100100101 111110010010100
异或版本字符串和填充生成器多项式:
1110000000000 ^ 111110010010100 = 110010010100
这个字符串的长度已经达到了要求的12,所以不需要再进行分割。与格式信息字符串一样,如果结果小于12,就必须在左边填充0,使其成为12位长。
最后,将原始六位版本字符串放在上一步结果的左侧。
版本字符串:000111
上面的纠错字符串:110010010100
最终版本信息字符串:000111110010010100
有关所有可能的版本信息字符串的完整列表,请参阅格式和版本表。
将版本字符串放在二维码中
必须放置版本信息字符串的两个矩形区域:一个位于左下角,一个位于右上角。
左下角版本信息块
左下角的版本信息块高 3 像素,宽 6 像素。下表说明了如何在左下角的版本信息区域中排列版本信息字符串的位。0 表示版本信息字符串的最右(最不重要)位,17 表示版本信息字符串的最左(最重要)位。
00 | 03 | 06 | 09 | 12 | 15 |
01 | 04 | 07 | 10 | 13 | 16 |
02 | 05 | 08 | 11 | 14 | 17 |
右上角版本信息块
右上角的版本信息块宽 3 像素,高 6 像素。下表说明了如何在右上角的版本信息区域中排列版本信息字符串的位。0 表示版本信息字符串的最右(最不重要)位,17 表示版本信息字符串的最左(最重要)位。
00 | 01 | 02 |
03 | 04 | 05 |
06 | 07 | 08 |
09 | 10 | 11 |
12 | 13 | 14 |
15 | 16 | 17 |
以版本 7 信息字符串000111110010010100为例,上表中的数字对应于位,如下所示:
17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
版本 7 信息字符串的示例
下图是版本 7 二维码,它使用版本信息字符串 000111110010010100。请注意,版本信息区域是根据上表中描述的模式填写的。
![notion image](https://www.thonky.com/qr-code-tutorial/version-example.png?t=c88e9a29-f497-4d35-8d3c-174ea4ae9870)
输出最终矩阵
将格式和版本信息添加到二维码矩阵后的最后一步是使用确定为具有最低惩罚分数的掩码模式输出最终矩阵。
添加静区
请注意,二维码规范要求二维码矩阵被一个静区域包围:一个 4 个模块宽的亮模块区域。
最终输出
下图是 HELLO WORLD 的 1-Q 二维码,以字符模式编码。
![notion image](https://www.thonky.com/qr-code-tutorial/hello-world-final.png?t=a72b8281-7599-4565-a307-5bac9de359c9)
结论
二维码教程到此结束。总之,二维码是通过以下步骤生成的:
- 确定要使用的编码模式
- 对数据进行编码
- 生成纠错码字
- 交错块(如有必要)
- 将数据和纠错位放入矩阵中
- 应用遮罩模式并确定哪一个导致最低惩罚
- 添加格式和版本信息