纠错编码

 
纠错码字允许二维码阅读器检测和纠正二维码中的错误。本页介绍如何在对数据进行编码后创建这些纠错码字。

步骤1:如有必要,将数据码字分解为块

在生成纠错码字之前,如果二维码大于版本 2,则可能需要将数据码字分解为更小的块。例如,如果创建一个 5-Q 二维码,纠错表显示 5-Q 码有 62 个数据码字(8 位二进制数字符串)。
例如:
(码字#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
(码字#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
(码字#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
(码字#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
纠错表提到了“第 1 组”和“第 2 组”,以及“块数”。这意味着数据码字必须分成最多两组,并且在每组中,数据码字可以进一步分解为块。数据码字按顺序分解(即从码字 1 开始,然后是码字 2,依此类推)。
对于 5-Q 代码,它说有两组,第一组应分解为 2 个块,每个块包含 15 个数据码字,第二个组应分解为 2 个块,每个块包含 16 个数据码字。请注意,15+15+16+16 = 62,这是数据码字的总数。下面是上面的码字,分为正确的组和块,以说明如何执行此步骤。
组号
区块编号
组中的数据码字
第 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
(码字#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
在表中,请注意,第 1 组中的块由 15 个数据码字组成,第 2 组中的块由纠错表中指定的 16 个数据码字组成。另请注意,它们是按顺序分解的。也就是说,它们的顺序与被分成块之前的顺序相同。
纠错表还说,对于5-Q码,每个块有18个纠错码字。在此示例中,有四个块,因此将有四组 18 个纠错码字,总共 72 个纠错码字。
纠错表所示,较小的二维码根本不需要分解数据码字,因此,对于 1-M 码(例如),所有 16 个数据码字将用作单个块,只需要生成 10 个纠错码字。
在继续5-Q示例之前,有必要解释Reed-Solomon纠错的基本步骤。

第 2 步:了解多项式长除法

纠错码字将使用称为Reed-Solomon纠错的方法生成。该过程的一部分是执行多项式长除法。也就是说,将一个多项式除以另一个多项式。本教程假设您了解如何手动执行标准长除法(即使用数字而不是多项式)。有关更多信息,请阅读wikiHow关于如何进行长除法的文章。
多项式长除法比标准长除法稍微复杂一些。为了帮助澄清这个过程,这里有一个多项式长除法的简单例子。
此示例将(被除数)除以 x + 1(除数)。这些多项式首先被放入一个表格中(有关此表示法的解释,请参阅维基百科关于长除法的文章)。
在长除法的每一步中,将 x + 1 乘以某物,使其第一项等于表底部多项式的项。
第一步,  位于底部,因此将 x + 1 乘以 3x。这将得到   ,其第一项与表底部多项式的第一项相同。下面是更新的结果。
现在从   中减去   。这将得到 -2x - 1(因为 x - 3x 是 (1 - 3)x ,即 -2x)。末尾的 -1 是从原始多项式继承而来的。下面是更新的结果。
继续将 x + 1 乘以一个项,这将得到一个第一项与底部多项式的首项相同的多项式。因此,应该乘以 -2 ,来得到 -2x - 2。下面是更新的结果。
现在,再次减去两个多项式。-2x 会抵消,但这会留下 -1 - 2,等于 1,如下面的最后一个结果所示。
余数为 1。从数学上讲,它是 。可以将 (x + 1) 乘以 1/x 以使第一项相同,但由于这是一个分数,这意味着不可能进一步进行长除法,即底部的 1 是余数。
总的来说,多项式长除法的步骤是:
  1. 找到合适的数与除数多项式相乘。乘法的结果应该与被除数(在第一个乘法步骤中)或余数(在所有后续的乘法步骤中)的首项相同。
  1. 从被除数(在第一个乘法步骤中)或余数(在所有随后的乘法步骤中)中减去该结果。
  1. 重复第1和第2步,直到不可能再乘以整数,或者换句话说,需要乘以分数。表底的数字是余数。
里德-所罗门纠错所需的多项式长除法在某些方面比这个例子更简单,因为不需要处理多项式项的指数。

第 3 步:了解伽罗瓦域

如上一节所述,要生成纠错码字,此过程使用一种称为 Reed-Solomon 纠错的方法。与多项式长除法一起,此方法使用伽罗瓦域,它本质上是一组受限制的数字,以及一些创建仍在该集中的数字的数学运算。
二维码标准说使用按位模2算法和按字节模100011101算法。这意味着使用伽罗瓦域,或者换句话说为伽罗瓦域256,有时写为GF(256)。
GF(256) 中的数字都将在 0 到 255(含)范围内。请注意,这与可以用 8 位字节表示的数字范围相同(可能的最大八位字节为 11111111,等于 255)。
这意味着 GF(256) 中的所有数学运算都将产生可以表示为 8 位字节的数字。

第 4 步:了解伽罗瓦域算法

如前所述,GF(256) 包含数字 0 到 255(包括 0 和 255)。GF(256) 中的数学运算本质上是循环的,这意味着如果在 GF(256) 中执行的数学运算导致一个大于 255 的数字,则必须使用模运算来获得仍在伽罗瓦域中的数字。
在伽罗瓦域中,负数与正数具有相同的值,因此 -n = n。换句话说,始终使用伽罗瓦域算法中涉及的数字的绝对值。
这意味着伽罗瓦域内的加法和减法是一回事。伽罗瓦域中的加法和减法是通过正常执行加法或减法来执行的,然后执行模运算。由于我们使用按位模 2 算法(如二维码规范中所述),这与执行 XOR 操作相同。
例如:
1 + 1 = 2 % 2 = 0
1 ⊕ 1 = 0
 
0 + 1 = 1 % 2 = 1
0 ⊕ 1 = 1
为了对二维码进行编码,GF(256) 中的所有加法和减法都是通过将两个数字异或运算在一起来执行的。

第 5 步:使用字节模100011101生成 2 的幂

GF(256) 中的所有数字都可以表示为 2 的幂。具体来说,GF(256) 中的所有数字都可以表示为 ,其中 0 8 对于伽罗瓦域来说似乎太大了,因为它等于 256。
从 0 到 8 的 2 的幂是:
二维码规范使用逐字节模100011101算法(其中100011101是一个二进制数,相当于十进制的 285)。这意味着当一个数字是 256 或更大时,它应该与285进行异或运算。这会导致28或更大的意外值。
换句话说:
= 256 ^ 285 = 29
请注意,当继续到 时,不要取其通常的值 512 与 285进行异或(无论如何这都会导致数字太大)。相反,由于 ,请使用上一步中计算的值
换句话说:
继续使用前一个2的幂来创造下一个2的幂:
每当获得大于或等于 256 的值时,再次与 285 异或:
通常,这些值始终等于前一次幂的 2 倍,如果该值为 256 或更大,则与 285 进行异或运算。使用此过程,GF(256) 中的所有数字都可以用 表示,其中 n 是 0 范围内的数字。

步骤 6:了解使用对数和反对数的乘法

因为如上所述,所有值都可以用 表示,所以可以对数和反对数来简化 GF(256) 中的乘法。(顺便说一下,这就是计算尺的原理,尽管它们不限于 GF(256))。
简化是可能的,因为一般来说(即不仅仅是在伽罗瓦域中),可以将两个数字 p 和 q 采取以下运算:
在这种情况下,使用了基数 2,因此上面的操作变为
并且 操作告诉我们乘以 2 多少次才能得到 x 的答案。换句话说,它将确定 n ,其中
这为在 GF(256) 中乘以数字提供了快捷方式。当将两个具有相同基数的数字相乘时,例如,这相当于将两个指数相加,如下所示:
这意味着由于所有 GF(256) 值都表示为 2 的幂(在上一节中解释过),GF(256) 中的所有乘法都可以作为以 2 为底指数的加法来执行。
例如,要将 16 * 32 相乘,这与将 乘以 相同。如上一段所述,这与 相同。的值已经计算出来了,因此在 GF(256) 中,按字节模 285,16 * 32 是 ,在上一节中确定等于 58。
添加指数时,如果指数大于或等于 256,只需应用模 255。换句话说:
因此,在 GF(256) 中执行乘法所需要的只是生成 2 的所有幂。这些值已经计算出来,可以在对数反对数表中找到。该表使用字母表示法,其中 α = 2。二维码规范在附件A中也使用字母表示法。
伽罗瓦域(256)的二维码对数反对数表

第 7 步:了解生成器多项式

我们在生成纠错码字方面取得了很大进展,但我们还没有完全做到这一点。下一步是了解生成器多项式。
如前所述,纠错编码使用多项式长除法。为此,需要两个多项式。要使用的第一个多项式称为消息多项式。消息多项式使用数据编码步骤中的数据码字作为其系数。例如,如果转换为整数的数据码字为 25、218 和 35,则消息多项式将为 。在实践中,标准二维码的真实消息多项式要长得多,但这只是一个示例。
消息多项式将被 生成器多项式 除。生成器多项式是通过乘法得到的,其中 n 是必须生成的纠错码字数(参见纠错表)。如上一节所述,α (alpha) 等于 2。
可以通过编程方式创建可能需要的所有生成器多项式。在此过程中,本教程将使用本页前面描述的 alpha 表示法和对数反对数乘法。
二维码规范在附录 A 中列出了生成器多项式,从 2 开始,以 68 结束。尽管标准二维码每个块总是需要 2 个以上的纠错码字,但此页面将展示如何计算 2 个纠错码字的生成器多项式,因为它说明了计算所有其他生成器多项式的过程。

2个纠错码字的发生器多项式

首先,乘以
由于 x 的系数为 1,并且由于 ,因此可以写为
将第一部分的每个项乘以第二部分的每个项得到:
请注意,指数加法可以在这里用于计算乘法:
结果:
现在,组合类似的多项式。有两个 项,因此将它们相加
请记住,GF(256) 中的加法是由异或执行的。使用对数反数表将 α 转换为它们的整数对应项,然后执行 异或计算。
回到字母表示法,这是
这是 2 个纠错码字的生成器多项式。
 

3个纠错码字的发生器多项式

可以使用前面每个步骤中的生成器多项式以相同的方式创建所有其他生成器多项式。从前一个生成器多项式开始,然后将其乘以下一个因子,在本例中为
要相乘,请将指数相加,如下所示:
添加指数后,结果为:
现在合并同类项。
 
这是 3 个纠错码字的生成器多项式。
 

当指数大于或等于 256 时

通过将指数相加来执行乘法时,有时这可能会导致指数大于或等于 256。在这种情况下,在组合类似项之前需要模 255。例如

其他生成器多项式

通常,可以创建所有生成器多项式 g(x),如下所示:
(g(x) 表示 2 个纠错码字) * = (g(x) 表示 3 个纠错码字)
(g(x) 表示 3 个纠错码字) * = (g(x) 表示 4 个纠错码字)
(g(x) 表示 4 个纠错码字) * = (g(x) 表示 5 个纠错码字)
...
(g(x) 表示 n-1 个纠错码字) * = (g(x) 表示 n 个纠错码字)
若要获取特定的生成器多项式而无需以编程方式计算它,生成器多项式工具可以创建它。

步骤 8:生成纠错码字

现在终于到了开始生成纠错码字的时候了。本部分使用字符模式编码页面上 HELLO WORLD 示例中的数据码字。这些码字将用作消息多项式的系数。此示例使用纠错级别 M 和版本 1 来创建 1-M 代码。

消息多项式

数据编码步骤将为 HELLO WORLD 生成以下数据码字作为 1-M 二维码。
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000 11101100 00010001 11101100 00010001 11101100 00010001
将这些二进制数转换为十进制:32, 91, 11, 120, 209, 114, 220, 77, 67, 64, 236, 17, 236, 17, 236, 17
这些数字是消息多项式的系数。换句话说:等等

生成器多项式

首先,获取生成器多项式。由于这是一个 1-M 的二维码,纠错表说要创建 10 个纠错码字。因此,使用以下生成器多项式:
(请参阅本页前面的生成器多项式工具和有关生成器多项式的讨论。)

分工步骤

现在是时候将消息多项式除以生成器多项式了。此操作的方式与页面上前面显示的多项式长除法大致相同。以下是更新后的除法步骤,以将伽罗瓦域算法考虑在内:
  1. 找到适当的项来与生成器多项式相乘。乘法的结果应该与消息多项式(在第一个乘法步骤中)或余数(在所有后续的乘法步骤中)的首项相同。
  1. 将结果与消息多项式(在第一个乘法步骤中)或余数(在所有后续的乘法步骤中)进行异或。
  1. 执行这些步骤 n 次,其中 n 是数据码字的数量。
请注意这些步骤与普通多项式长除法步骤之间的差异。我们不是在乘法步骤后做减法,而是执行异或(在 GF(256) 中,这是一回事)。
更重要的是,在将两个多项式除以后,将有一个余数。此余数的系数是纠错码字。
下一节将逐步说明这个除法。

步骤 9:将消息多项式除以生成器多项式

除法的第一步是为除法准备消息多项式。完整的消息多项式是:
为了确保引导项的指数在除法期间不会变得太小,请将消息多项式乘以 ,其中 n 是所需的纠错码字数。在这种情况下,n 是 10,对于 10 个纠错码字,因此将消息多项式乘以 ,得到:
生成器多项式的引导项也应该具有相同的指数,因此乘以得到
现在可以执行重复的除法步骤。除法中的步数必须等于消息多项式中的项数。在这种情况下,该除法将采取 16 个步骤来完成。这将导致余数有 10 个项。这些项将是所需的 10 个纠错码字。

步骤 1a:将生成器多项式乘以消息多项式的前导项

第一步是将生成器多项式乘以消息多项式的前导项。本例中的引导项是 。由于字母表示法使执行乘法更容易,因此建议将 转换为字母表示法。根据对数反对数表,对于整数值 32,α 指数为 5。因此 。将生成器多项式乘以
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 1b:将结果与消息多项式进行异或

由于这是第一个除法步骤,将1a的结果与消息多项式进行异或。
结果是:
丢弃前导的 0 项以获得:

步骤 2a:将生成器多项式乘以上一步的 XOR 结果的引导项

接下来,将生成器多项式乘以上一步的异或结果的引导项。在这种情况下,主要项是 。将 转换为字母表示法。根据对数反对数表,对于整数值 89,α 指数为 210。因此 。将生成器多项式乘以
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 2b:将结果与步骤 1b 的结果进行异或

使用步骤 1b 中的结果执行下一个 异或。
结果是:
丢弃前导的 0 项以获得:

步骤 3a:将生成器多项式乘以上一步的异或结果的前导项

接下来,将生成器多项式乘以上一步的异或结果的引导项。本例中的引导项是 。将 转换为字母表示法。根据对数反对数表,对于整数值 61,α的指数为 228。因此 。将生成器多项式乘以 α^{228}:
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 3b:将结果与步骤 2b 的结果进行 XOR

使用步骤 2b 中的结果执行下一个 XOR。
结果是:
丢弃前导 0 项以获得:

步骤 4a:将生成器多项式乘以上一步的 XOR 结果的引导项

接下来,将生成器多项式乘以上一步的 XOR 结果的引导项。本例中的引导项是 。将 转换为字母表示法。根据对数反对数表,对于整数值 138,α的指数为 222。因此 。将生成器多项式乘以
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 4b:将结果与步骤 3b 的结果进行 XOR

使用步骤 3b 中的结果执行下一个 XOR。
结果是:
丢弃前导 0 项以获得:

步骤 5a:将生成器多项式乘以上一步的 XOR 结果的前导项

接下来,将生成器多项式乘以上一步的 XOR 结果的引导项。在这种情况下,主要项是 。将 转换为字母表示法。根据对数反对数表,对于整数值 243,α的指数为 233。因此 。将生成器多项式乘以
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 5b:将结果与步骤 4b 的结果进行 XOR

使用步骤 4b 中的结果执行下一个 XOR。
结果是:
丢弃前导 0 项以获得:

步骤 6a:将生成器多项式乘以上一步的 XOR 结果的前导项

接下来,将生成器多项式乘以上一步的 XOR 结果的引导项。本例中的引导项是 。将 转换为字母表示法。根据对数反对数表,对于整数值 149,α的指数为 184。因此 。将生成器多项式乘以
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 6b:将结果与步骤 5b 的结果进行 XOR

使用步骤 5b 中的结果执行下一个 XOR。
结果是:
丢弃前导 0 项以获得:

步骤 7a:将生成器多项式乘以上一步的 XOR 结果的前导项

接下来,将生成器多项式乘以上一步的 XOR 结果的引导项。本例中的引导项是 。将 转换为字母表示法。根据对数反对数表,对于整数值 135,α的指数为 13。因此 。将生成器多项式乘以
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 7b:将结果与步骤 6b 的结果进行 XOR

使用步骤 6b 中的结果执行下一个 XOR。
结果是:
丢弃前导 0 项以获得:

步骤 8a:将生成器多项式乘以上一步的 XOR 结果的引导项

接下来,将生成器多项式乘以上一步的 XOR 结果的引导项。本例中的引导项是 。将 转换为字母表示法。根据对数反对数表,对于整数值 183,α的指数为 158。因此 。将生成器多项式乘以
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 8b:将结果与步骤 7b 的结果进行 XOR

使用步骤 7b 中的结果执行下一个 XOR。
结果是:
丢弃前导 0 项以获得:

步骤 9a:将生成器多项式乘以上一步的 XOR 结果的前导项

接下来,将生成器多项式乘以上一步的 XOR 结果的引导项。本例中的引导项是 。将 转换为字母表示法。根据对数反对数表,对于整数值 59,α的指数为 120。因此 。将生成器多项式乘以
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 9b:将结果与步骤 8b 的结果进行 XOR

使用步骤 8b 中的结果执行下一个 XOR。
结果是:
丢弃前导 0 项以获得:

步骤 10a:将生成器多项式乘以上一步的 XOR 结果的引导项

接下来,将生成器多项式乘以上一步的 XOR 结果的引导项。本例中的主要项是 。将 转换为字母表示法。根据对数反对数表,对于整数值 184,α的指数为 132。因此 。将生成器多项式乘以 α^{132}:
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 10b:将结果与步骤 9b 的结果进行 XOR

使用步骤 9b 中的结果执行下一个 XOR。
结果是:
丢弃前导 0 项以获得:

步骤 11a:将生成器多项式乘以上一步的 XOR 结果的前导项

接下来,将生成器多项式乘以上一步的 XOR 结果的引导项。本例中的引导项是 。将 转换为字母表示法。根据对数反对数表,对于整数值 51,α的指数为 125。因此 。将生成器多项式乘以
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 11b:将结果与步骤 10b 的结果进行 XOR

使用步骤 10b 中的结果执行下一个 XOR。
结果是:
丢弃前导 0 项以获得:

步骤 12a:将生成器多项式乘以上一步的 XOR 结果的前导项

接下来,将生成器多项式乘以上一步的 XOR 结果的引导项。本例中的引导项是 。将 转换为字母表示法。根据对数反对数表,对于整数值 41,α的指数为 147。因此 。将生成器多项式乘以
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 12b:将结果与步骤 11b 的结果进行 XOR

使用步骤 11b 中的结果执行下一个 XOR。
结果是:
丢弃前导 0 项以获得:

步骤 13a:将生成器多项式乘以上一步的 XOR 结果的引导项

接下来,将生成器多项式乘以上一步的 XOR 结果的引导项。本例中的引导项是 。将 转换为字母表示法。根据对数反数表,对于整数值 179,α的指数为 171。因此 。将生成器多项式乘以
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 13b:将结果与步骤 12b 的结果进行 XOR

使用步骤 12b 中的结果执行下一个 XOR。
结果是:
丢弃前导 0 项以获得:

步骤 14a:将生成器多项式乘以上一步的 XOR 结果的前导项

接下来,将生成器多项式乘以上一步的 XOR 结果的引导项。在这种情况下,引导项是 。将 转换为字母表示法。根据对数反对数表,对于整数值 70,α 的指数为 48。因此 70 = 。将生成器多项式乘以
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 14b:将结果与步骤 13b 的结果进行 XOR

使用步骤 13b 中的结果执行下一个 XOR。
结果是:
丢弃前导 0 项以获得:

步骤 15a:将生成器多项式乘以上一步的 XOR 结果的引导项

接下来,将生成器多项式乘以上一步的 XOR 结果的引导项。本例中的引导项是 。将 转换为字母表示法。根据对数反对数表,对于整数值 84,α的指数为 143。因此 。将生成器多项式乘以
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 15b:将结果与步骤 14b 的结果进行 XOR

使用步骤 14b 中的结果执行下一个 XOR。
结果是:
丢弃前导 0 项以获得:

步骤 16a:将生成器多项式乘以上一步的 XOR 结果的前导项

接下来,将生成器多项式乘以上一步的 XOR 结果的引导项。本例中的主要项是 。将 转换为字母表示法。根据对数反对数表,对于整数值 107,α的指数为 84。因此 。将生成器多项式乘以
α的指数相加。在这种情况下,至少有一个指数大于 255,因此按如下方式执行模 255:
结果是:
现在,将其转换为整数表示法:

步骤 16b:将结果与步骤 15b 的结果进行 XOR

使用步骤 15b 中的结果执行下一个 XOR。
结果是:
丢弃前导 0 项以获得:

使用余数的项作为纠错码字

除法已执行 16 次,这是消息多项式中的项数。这意味着除法是完全的,上述多项式的项是用于原始消息多项式的纠错码字:
196  35  39  119  235  215  231  226  93  23

下一篇: 结构最终消息

数据码字和纠错码字现已生成。对于较大的二维码,二维码规范要求根据特定模式交错码字。下一节结构化最终信息将解释交错过程。