Wie wird eine CRC32 Prüfsumme berechnet?
Vielleicht bin ich auch nur nicht sehen, aber CRC32 scheint entweder unnötig kompliziert oder unzureichend erklärt und wo ich im Netz finden konnte.
Ich verstehen, dass es der Rest von einem nicht-tragen-basierte arithmetische Teilung der Meldung Wert, geteilt durch die (generator -) Polynom, aber die tatsächliche Umsetzung von it-entgeht mir.
Habe ich gelesen Ein Painless Guide To CRC Error Detection Algorithmenund ich muss sagen, es war nicht schmerzfrei. Es geht über die Theorie ziemlich gut, aber der Autor wird nie ein einfaches "das ist es." Er sagt, was die Parameter sind für die standard-CRC32-Algorithmus, aber er versäumt zu legen, klar, wie Sie es erhalten.
Den Teil, der mich bekommt wird, wenn er sagt "das ist es" und fügt dann an, "ach übrigens, es kann rückgängig gemacht werden, oder Schritte mit verschiedenen Anfangsbedingungen," und nicht geben eine klare Antwort auf die Frage, was die Letzte Möglichkeit, die Berechnung einer Prüfsumme CRC32 angesichts all der Veränderungen, die er gerade Hinzugefügt haben.
- Gibt es eine einfachere Erklärung, wie die CRC32 wird berechnet?
Ich habe versucht, code in C, wie die Tabelle gebildet:
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;
}
aber das scheint zu generieren Werte unvereinbar mit den Werten, die ich gefunden habe an anderer Stelle auf den Internet. Ich könnte verwenden Sie die Werte, die ich online gefunden, aber ich möchte verstehen, wie Sie erstellt wurden.
Alle helfen beim klären von diesen unglaublich verwirrenden zahlen würde sehr geschätzt.
InformationsquelleAutor der Frage aquanar | 2010-04-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Polynom für CRC32 ist:
die arbeiten im Binär:
Fühlen Sie sich frei, um die Anzahl der 1en und 0EN, aber Sie werden feststellen, dass Sie übereinstimmen mit dem Polynom, wo
1
ist bit 0 (oder das erste bit) undx
ist bit 1 (oder das zweite bit).Warum dieses Polynoms? Denn es muss den durch die Norm gegebenen Polynoms und der standard wurde von der IEEE 802.3. Auch ist es extrem schwer zu finden ein Polynom, das erkennt verschiedene bit-Fehler effektiv.
Kann man sich den CRC-32 als eine Reihe von Binären Arithmetik mit Nicht Trägt", oder grundsätzlich "XOR und shift-Operationen". Dies wird technisch als Polynom-Arithmetik.
Besser zu verstehen, denken Sie an dieses Multiplikation:
Wenn wir annehmen, x ist die Basis 2, dann erhalten wir:
Warum? Denn 3x^3 ist 11x^11 (aber wir brauchen nur 1 oder 0, pre-stellig), so führen wir über:
Aber der Mathematiker hat die Regeln geändert, so dass es mod 2. Also im Grunde einem binären Polynom mod 2 ist nur zusätzlich ohne tragen oder XORs. Also unsere ursprüngliche Gleichung sieht wie folgt aus:
Ich weiß, das ist ein Sprung des Glaubens, aber das ist jenseits meiner Fähigkeit als line-Programmierer. Wenn Sie ein Hardcore-CS-student oder Ingenieur zu werden, ich fordere, diese zu brechen nach unten. Jeder profitiert von dieser Analyse.
Also ein vollständiges Beispiel:
Nun teilen wir die augmented-Nachricht, die von der Poly mit CRC-Arithmetik. Dies ist die gleiche Aufteilung wie vorher:
Die division ergibt den Quotienten, die wir wegwerfen, und einen Rest, der die berechnete Prüfsumme. Damit endet die Berechnung. In der Regel wird die Prüfsumme wird anschließend an die Nachricht und das Ergebnis übertragen. In diesem Fall würde die übertragung werden: 11010110111110.
Nur verwenden Sie eine 32-bit-Zahl, da Ihre Teiler und verwenden Ihre gesamte Strom auf, wie Sie Ihre Dividende. Werfen Sie den Quotienten und halten den Rest. Heften Sie den Rest am Ende der Nachricht, und Sie haben eine CRC32.
Durchschnittlichen Kerl abgeben:
(Beachten Sie, dass der stream muss teilbar sein durch 32-bit-oder sollte es gepolstert sein. Zum Beispiel, ein 8-bit-ANSI-stream müsste aufgefüllt werden. Auch am Ende des Streams, die division ist gestoppt.)
InformationsquelleAutor der Antwort
Einer CRC ist ziemlich einfach; Sie nehmen ein Polynom dargestellt, die als bits und die Daten, und dividieren Sie das Polynom in den Daten (oder die Daten darstellen als ein Polynom und das gleiche tun). Der Rest, der zwischen 0 und das Polynom der CRC. Dein code ist ein bisschen schwer zu verstehen, teilweise, weil es unvollständig: temp und testcrc sind nicht deklariert, es ist also unklar, was indiziert, und wie viel Daten, die durch den Algorithmus.
Den Weg, um zu verstehen CRCs ist es, zu versuchen, um zu berechnen, ein paar mit einem kurzen Stück der Daten (16 bit oder so) mit einem kurzen Polynom -- 4 bits, vielleicht. Wenn Sie auf diese Weise praktizieren, werden Sie wirklich verstehen, wie Sie gehen könnte, über Codierung.
Wenn Sie es tun, oft ein CRC ist ziemlich langsam, um zu berechnen, in der software. Hardware-Berechnung ist viel effizienter, und erfordert nur ein paar Tore.
InformationsquelleAutor der Antwort WhirlWind
Neben der Wikipedia Cyclic redundancy check und Berechnung der CRC Artikel, fand ich ein Papier mit dem Titeldie Umkehrung CRC - Theorie und Praxis *um eine gute Referenz.
Gibt es im wesentlichen drei Ansätze für die Berechnung eines CRC: einen algebraischen Ansatz, ein bit-orientierter Ansatz und ein table-driven-Ansatz. Indie Umkehrung CRC - Theorie und Praxis *jede dieser drei algorithmen/Ansätze erklärt in der Theorie begleitet, die im ANHANG durch eine Implementierung für die CRC32 in der Programmiersprache C.
* PDF-Link
Die Umkehrung CRC – Theorie und Praxis.
HU Berlin Public Report
SAR-PR-2006-05
Mai 2006
Autoren:
Martin Stigge, Henryk Plötz, Wolf Müller, Jens-Peter Redlich
InformationsquelleAutor der Antwort jschmier
Für IEEE802.3, CRC-32. Denke, die gesamte Nachricht wie ein serieller bit-Strom, append 32 Nullen an das Ende der Nachricht. Als Nächstes MÜSSEN Sie umkehren der bits für JEDES byte der Nachricht und eine 1-Komplement der ersten 32 bits. Nun dividieren Sie durch die CRC-32-Polynom, 0x104C11DB7. Schließlich müssen Sie die 1-Komplement 32-bit Rest dieser division bit-reverse-jedes der 4 bytes der Rest. Dies wird die 32-bit-CRC angehängt wird, um das Ende der Nachricht.
Den Grund für dieses seltsame Verfahren ist, dass die ersten Ethernet-Implementierungen würde serialisieren der Nachricht byte für byte und übermittelt das " least significant bit von jedem byte zuerst. Die seriellen bit-Strom ging dann über eine serielle CRC-32 shift register Berechnung, die einfach ergänzt und geschickt auf den Draht, nachdem die Nachricht fertiggestellt wurde. Der Grund für die Ergänzung der ersten 32 bits der Nachricht ist also, dass Sie nicht mit einem all-null-CRC, auch wenn die Botschaft war alles Nullen.
InformationsquelleAutor der Antwort Pavlo Bobrek
Verbrachte ich eine Weile versucht zu entdecken, die Antwort auf diese Frage, und ich schließlich veröffentlichte ein tutorial auf CRC-32 heute:
CRC-32-hash-tutorial - AutoHotkey Community
In diesem Beispiel, das ich zeigen, wie die Berechnung der CRC-32-hash für den ASCII-string 'abc':
InformationsquelleAutor der Antwort vafylec