CRC32 的多项式是:
x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x + 1
或十六进制和二进制:
0x 01 04 C1 1D B7
1 0000 0100 1100 0001 0001 1101 1011 0111
最高项 (x 32 ) 通常没有明确写出,因此它可以用十六进制表示,就像
0x 04 C1 1D B7
随意计算 1 和 0,但您会发现它们与多项式相匹配,1
即位 0(或第一位)和x
位 1(或第二位)。
为什么是这个多项式?因为需要有一个给定多项式的标准,并且该标准是由 IEEE 802.3 制定的。此外,要找到有效检测不同误码的多项式也非常困难。
您可以将 CRC-32 视为一系列“无进位的二进制算术”,或者基本上是“XOR 和移位运算”。这在技术上称为多项式算术。
为了更好地理解它,想想这个乘法:
(x^3 + x^2 + x^0)(x^3 + x^1 + x^0)
= (x^6 + x^4 + x^3
+ x^5 + x^3 + x^2
+ x^3 + x^1 + x^0)
= x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0
如果我们假设 x 是以 2 为底,那么我们得到:
x^7 + x^3 + x^2 + x^1 + x^0
为什么?因为 3x^3 是 11x^11 (但我们只需要 1 或 0 个前置数字)所以我们结转:
=1x^110 + 1x^101 + 1x^100 + 11x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^101 + 1x^100 + 1x^100 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^101 + 1x^101 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^110 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^111 + 1x^11 + 1x^10 + 1x^1 + x^0
但是数学家改变了规则,使其成为 mod 2。所以基本上任何二进制多项式 mod 2 都只是没有进位或 XOR 的加法。所以我们的原始方程看起来像:
=( 1x^110 + 1x^101 + 1x^100 + 11x^11 + 1x^10 + 1x^1 + x^0 ) MOD 2
=( 1x^110 + 1x^101 + 1x^100 + 1x^11 + 1x^10 + 1x^1 + x^0 )
= x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0 (or that original number we had)
我知道这是一种信念的飞跃,但这超出了我作为一名线路程序员的能力。如果你是一名核心 CS 学生或工程师,我会挑战打破这一点。每个人都会从这个分析中受益。
所以要制定一个完整的例子:
Original message : 1101011011
Polynomial of (W)idth 4 : 10011
Message after appending W zeros : 11010110110000
现在我们使用 CRC 算法将增强消息除以 Poly。这是和以前一样的划分:
1100001010 = Quotient (nobody cares about the quotient)
_______________
10011 ) 11010110110000 = Augmented message (1101011011 + 0000)
=Poly 10011,,.,,....
-----,,.,,....
10011,.,,....
10011,.,,....
-----,.,,....
00001.,,....
00000.,,....
-----.,,....
00010,,....
00000,,....
-----,,....
00101,....
00000,....
-----,....
01011....
00000....
-----....
10110...
10011...
-----...
01010..
00000..
-----..
10100.
10011.
-----.
01110
00000
-----
1110 = Remainder = THE CHECKSUM!!!!
除法产生一个商,我们将其丢弃,并产生一个余数,即计算出的校验和。这结束了计算。通常,校验和会被附加到消息中并传输结果。在这种情况下,传输将是:11010110111110。
仅使用 32 位数字作为除数,并使用整个流作为除数。扔掉商并保留余数。在邮件末尾添加其余部分,您将获得 CRC32。
普通人评论:
QUOTIENT
----------
DIVISOR ) DIVIDEND
= REMAINDER
- 取前 32 位。
- 移位位
- 如果 32 位小于 DIVISOR,则转到步骤 2。
- 通过 DIVISOR 异或 32 位。转到第 2 步。
(请注意,流必须可被 32 位整除,否则应进行填充。例如,必须填充 8 位 ANSI 流。同样在流结束时,停止除法。)