Vielleicht sehe ich es einfach nicht, aber CRC32 scheint entweder unnötig kompliziert oder unzureichend erklärt zu sein, wo immer ich es im Web finden kann.
Ich verstehe, dass es der Rest einer nicht Carry-basierten arithmetischen Division des Nachrichtenwerts ist, geteilt durch das (Generator-) Polynom, aber die tatsächliche Implementierung davon entgeht mir.
Ich habe einen schmerzlosen Leitfaden zu CRC-Fehlererkennungsalgorithmen gelesen , und ich muss sagen, dass er nicht schmerzlos war. Es geht ziemlich gut über die Theorie, aber der Autor kommt nie zu einem einfachen "das ist es". Er sagt zwar, welche Parameter für den Standard-CRC32-Algorithmus gelten, vernachlässigt jedoch, klar darzulegen, wie Sie dazu gelangen.
Der Teil, der mich erwischt, ist, wenn er sagt "das ist es" und dann hinzufügt: "Oh, übrigens, es kann umgekehrt oder mit unterschiedlichen Anfangsbedingungen begonnen werden" und keine klare Antwort auf den endgültigen Weg gibt der Berechnung einer CRC32-Prüfsumme unter Berücksichtigung aller Änderungen, die er gerade hinzugefügt hat.
- Gibt es eine einfachere Erklärung für die Berechnung von CRC32?
Ich habe versucht, in C zu codieren, wie die Tabelle gebildet wird:
for (i = 0; i < 256; i++)
{
temp = i;
for (j = 0; j < 8; j++)
{
if (temp & 1)
{
temp >>= 1;
temp ^= 0xEDB88320;
}
else {temp >>= 1;}
}
testcrc[i] = temp;
}
Dies scheint jedoch Werte zu erzeugen, die nicht mit den Werten übereinstimmen, die ich an anderer Stelle im Internet gefunden habe. Ich könnte die online gefundenen Werte verwenden, möchte aber verstehen, wie sie erstellt wurden.
Jede Hilfe bei der Aufklärung dieser unglaublich verwirrenden Zahlen wäre sehr dankbar.
0xEDB88320
kann auch msbit-first ( normal ) als geschrieben werden0x04C11DB7
. Wurden die Tabellenwerte, die Sie an anderer Stelle gefunden haben, mit demselben CRC-Polynom generiert?Antworten:
Das Polynom für CRC32 lautet:
Oder in hex und binär:
Der höchste Term (x 32 ) wird normalerweise nicht explizit geschrieben, daher kann er genauso wie in hexadezimaler Darstellung dargestellt werden
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) undx
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:
Wenn wir annehmen, dass x Basis 2 ist, erhalten wir:
Warum? Da 3x ^ 3 11x ^ 11 ist (aber wir brauchen nur 1 oder 0 Vorziffer), übertragen wir:
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:
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:
Jetzt teilen wir die erweiterte Nachricht durch die Poly mithilfe der CRC-Arithmetik. Dies ist die gleiche Unterteilung wie zuvor:
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:
(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.)
quelle
x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0 ... If we assume x is base 2 then we get: x^7 + x^3 + x^2 + x^1 + x^0
. So funktioniert die Mathematik nicht. Die Koeffizienten zum Polynom sind mod (2) oder GF (2), die x werden in Ruhe gelassen, was zu x ^ 6 + x ^ 5 + x ^ 4 + x ^ 3 + x ^ 2 + x ^ 1 + x ^ führt 0 (da 3 mod (2) = 1).Tack the remainder on the end of your message
- Technisch gesehen wird der Rest von den 0 Bits subtrahiert, die an die Nachricht angehängt wurden. Da dies jedoch mod (2) math ist, sind sowohl addieren als auch subtrahieren dieselben wie XOR, und die mit dem Rest XOR'ed Null-Bits sind dieselben als der Rest.Why did you append four 0s though?
- Die Softwarealgorithmen zur Berechnung von crc hängen die Nullen effektiv an, obwohl dies nicht ersichtlich ist. Wenn die CRC-Berechnung mithilfe der Langhanddivision angezeigt wird, müssen Nullen angehängt werden, damit das Divisionsbeispiel korrekt angezeigt wird.Für IEEE802.3 CRC-32. Stellen Sie sich die gesamte Nachricht als seriellen Bitstrom vor und hängen Sie 32 Nullen an das Ende der Nachricht an. Als nächstes MÜSSEN Sie die Bits JEDES Bytes der Nachricht umkehren und die ersten 32 Bits durch eine 1 ergänzen. Teilen Sie nun durch das CRC-32-Polynom 0x104C11DB7. Schließlich müssen Sie den 32-Bit-Rest dieser Division durch 1 ergänzen und jedes der 4 Bytes des Restes bitumkehren. Dies wird die 32-Bit-CRC, die an das Ende der Nachricht angehängt wird.
Der Grund für diese seltsame Prozedur ist, dass die ersten Ethernet-Implementierungen die Nachricht byteweise serialisieren und das niedrigstwertige Bit jedes Bytes zuerst übertragen. Der serielle Bitstrom durchlief dann eine serielle CRC-32-Schieberegisterberechnung, die einfach ergänzt und nach Abschluss der Nachricht auf der Leitung gesendet wurde. Der Grund für das Ergänzen der ersten 32 Bits der Nachricht ist, dass Sie keine CRC mit allen Nullen erhalten, selbst wenn die Nachricht nur Nullen war.
quelle
Ein CRC ist ziemlich einfach; Sie nehmen ein Polynom, das als Bits und Daten dargestellt wird, und teilen das Polynom in die Daten (oder Sie stellen die Daten als Polynom dar und tun dasselbe). Der Rest, der zwischen 0 und dem Polynom liegt, ist der CRC. Ihr Code ist etwas schwer zu verstehen, auch weil er unvollständig ist: temp und testcrc werden nicht deklariert, daher ist unklar, was indiziert wird und wie viele Daten durch den Algorithmus laufen.
Der Weg, CRCs zu verstehen, besteht darin, zu versuchen, einige mit einem kurzen Datenelement (ca. 16 Bit) mit einem kurzen Polynom zu berechnen - vielleicht 4 Bit. Wenn Sie auf diese Weise üben, werden Sie wirklich verstehen, wie Sie es codieren können.
Wenn Sie dies häufig tun, ist die Berechnung eines CRC in Software recht langsam. Hardware-Berechnungen sind viel effizienter und erfordern nur wenige Gates.
quelle
Zusätzlich zur zyklischen Redundanzprüfung und Berechnung von CRC- Artikeln in Wikipedia fand ich ein Papier mit dem Titel Reversing CRC - Theory and Practice * als gute Referenz.
Es gibt im Wesentlichen drei Ansätze zur Berechnung eines CRC: einen algebraischen Ansatz, einen bitorientierten Ansatz und einen tabellengesteuerten Ansatz. In Umkehrung von CRC - Theorie und Praxis * wird jeder dieser drei Algorithmen / Ansätze theoretisch im ANHANG mit einer Implementierung für CRC32 in der Programmiersprache C erläutert.
* PDF Link
Umkehrung von CRC - Theorie und Praxis.
HU Berlin Öffentlicher Bericht
SAR-PR-2006-05
Mai 2006
Autoren:
Martin Stigge, Henryk Plötz, Wolf Müller, Jens-Peter Redlich
quelle
Ich habe eine Weile versucht, die Antwort auf diese Frage zu finden, und heute endlich ein Tutorial zu CRC-32 veröffentlicht: CRC-32-Hash-Tutorial - AutoHotkey Community
In diesem Beispiel zeige ich, wie der CRC-32-Hash für die ASCII-Zeichenfolge 'abc' berechnet wird:
quelle
^
? stackoverflow.com/questions/62168128/…Dann gibt es immer Rosetta Code, der zeigt, dass crc32 in Dutzenden von Computersprachen implementiert ist. https://rosettacode.org/wiki/CRC-32 und enthält Links zu vielen Erklärungen und Implementierungen.
quelle
Um crc32 auf die Erinnerung zu reduzieren, müssen Sie:
Im Code ist dies:
wobei memorIEEE die reine Erinnerung an GF (2) ist [x]
quelle