CRC32的多项式为:
x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
或以十六进制和二进制表示:
0x 01 04 C1 1D B7
1 0000 0100 1100 0001 0001 1101 1011 0111
最高位(x32)通常不会明确写出,因此可以用十六进制表示为
0x 04 C1 1D B7
请随意计算1和0,但您会发现它们与多项式匹配,其中1
是第0位(或第一位),x
是第1位(或第二位)。
因为需要一个标准的多项式,而IEEE 802.3设置了这个标准,所以选择了这个多项式。此外,要找到一个有效检测不同位错误的多项式非常困难。
您可以将CRC-32视为一系列“没有进位的二进制算术”,或者基本上是“XOR和移位操作”。从技术上讲,这被称为多项式算术。
CRC入门指南,第5章
为了更好地理解它,请考虑以下乘法:
(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
但是数学家改变了规则,使其模2。因此,基本上任何二进制多项式模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)
我知道这需要一定的信仰,但作为一名线性编程人员,这已经超出了我的能力范围。如果你是一名硬核计算机科学学生或工程师,我挑战你来分解这个问题。每个人都将从这个分析中受益。
因此,让我们来看一个完整的例子:
Original message : 1101011011
Polynomial of (W)idth 4 : 10011
Message after appending W zeros : 11010110110000
现在,我们使用CRC算术将增强的消息除以多项式。这与之前的除法相同:
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位小于除数,则转到步骤2。
- 将32位异或除数。 转到步骤2。
(请注意,流必须可被32位整除,否则应进行填充。例如,8位ANSI流必须进行填充。在流的末尾,除法停止。)
0xEDB88320
也可以正向最高位(msbit-first)表示为0x04C11DB7
。你在别处找到的表格数值是否是使用相同的CRC多项式生成的? - jschmier