Das Polynom für CRC32 lautet:
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
Oder in hex und binär:
0x 01 04 C1 1D B7
1 0000 0100 1100 0001 0001 1101 1011 0111
Der höchste Term (x 32 ) wird normalerweise nicht explizit geschrieben, daher kann er genauso wie in hexadezimaler Darstellung dargestellt werden
0x 04 C1 1D B7
Fühlen Sie sich frei, die Einsen und Nullen zu zählen, aber Sie werden feststellen, dass sie mit dem Polynom übereinstimmen, wobei 1
Bit 0 (oder das erste Bit) und x
Bit 1 (oder das zweite Bit) ist.
Warum dieses Polynom? Weil es einen Standard für ein Polynom geben muss und der Standard von IEEE 802.3 festgelegt wurde. Es ist auch äußerst schwierig, ein Polynom zu finden, das verschiedene Bitfehler effektiv erkennt.
Sie können sich den CRC-32 als eine Reihe von "Binärarithmetik ohne Träger" oder im Grunde als "XOR- und Schichtoperationen" vorstellen. Dies wird technisch als Polynomarithmetik bezeichnet.
Um es besser zu verstehen, denken Sie an diese Multiplikation:
(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
Wenn wir annehmen, dass x Basis 2 ist, erhalten wir:
x^7 + x^3 + x^2 + x^1 + x^0
Warum? Da 3x ^ 3 11x ^ 11 ist (aber wir brauchen nur 1 oder 0 Vorziffer), übertragen wir:
=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
Aber Mathematiker haben die Regeln so geändert, dass es Mod 2 ist. Im Grunde genommen ist jedes binäre Polynom Mod 2 nur eine Addition ohne Carry oder XORs. Unsere ursprüngliche Gleichung sieht also so aus:
=( 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)
Ich weiß, dass dies ein Glaubenssprung ist, aber dies übersteigt meine Fähigkeiten als Linienprogrammierer. Wenn Sie ein Hardcore-CS-Student oder Ingenieur sind, fordere ich Sie auf, dies aufzuschlüsseln. Jeder wird von dieser Analyse profitieren.
Um ein vollständiges Beispiel zu erarbeiten:
Original message : 1101011011
Polynomial of (W)idth 4 : 10011
Message after appending W zeros : 11010110110000
Jetzt teilen wir die erweiterte Nachricht durch die Poly mithilfe der CRC-Arithmetik. Dies ist die gleiche Unterteilung wie zuvor:
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!!!!
Die Division ergibt einen Quotienten, den wir wegwerfen, und einen Rest, der die berechnete Prüfsumme ist. Damit ist die Berechnung beendet. Normalerweise wird die Prüfsumme dann an die Nachricht angehängt und das Ergebnis übertragen. In diesem Fall wäre die Übertragung: 11010110111110.
Verwenden Sie nur eine 32-Bit-Zahl als Divisor und Ihren gesamten Stream als Dividende. Wirf den Quotienten raus und behalte den Rest. Heften Sie den Rest am Ende Ihrer Nachricht an und Sie haben einen CRC32.
Durchschnittliche Bewertung:
QUOTIENT
----------
DIVISOR ) DIVIDEND
= REMAINDER
- Nimm die ersten 32 Bits.
- Bits verschieben
- Wenn 32 Bit kleiner als DIVISOR sind, fahren Sie mit Schritt 2 fort.
- XOR 32 Bit von DIVISOR. Weiter zu Schritt 2.
(Beachten Sie, dass der Stream durch 32 Bit teilbar sein muss oder aufgefüllt werden muss. Beispielsweise müsste ein 8-Bit-ANSI-Stream aufgefüllt werden. Auch am Ende des Streams wird die Teilung angehalten.)
0xEDB88320
kann auch msbit-first ( normal ) als geschrieben werden0x04C11DB7
. Wurden die Tabellenwerte, die Sie an anderer Stelle gefunden haben, mit demselben CRC-Polynom generiert?