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
但是数学家更改了规则,使其成为mod2。因此,基本上任何二进制多项式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位进行XOR。转到步骤2。
(请注意,该流必须可被32位整除,或者应对其进行填充。例如,必须填充8位ANSI流。同样在该流的末尾,该除法被暂停。)
0xEDB88320
也可以写为msbit-first(正常)0x04C11DB7
。您在其他地方找到的表值是使用相同的CRC多项式生成的吗?