Mit einem Beispiel für Daten mit einem Hexadezimalwert von 0xda
und einem Polynom 0x07
würde ich den CRC wie folgt finden (unter Verwendung der Methodik von Wikipedia )
0xda = 11011010
11011010|00000000
111
00111010|00000000
111
00000010|00000000
11 1
00000001|10000000
1 11
00000000|01000000
Aber die Antwort sollte 0x08
laut diesem Rechner lauten .
Ich brauche die richtige Antwort für das IEEE-Standard-Ethernet. Ich habe festgestellt, dass einige Quellen die Daten auffüllen und andere nicht . IEEE scheint vorzuschlagen, dass Padding erforderlich ist, wenn die Daten kleiner als die CRC-Breite sind.
Hinweis: Ich weiß, dass der CRC auch nicht streng der Rest der Daten ist, die durch das Polynom dividiert werden.
0xda = 11011010 = 218
0x07 = 00000111 = 7
218/7 = 31 r 1
Wie Sie unten sehen können, skizziert das IEEE viel mehr Schritte als auf Wikipedia vorgeschlagen. Wie kann ich sicher sein, dass die CRC-Rechner online die richtigen Werte für Ethernet liefern?
Für meinen Versuch, dem Standard zu folgen (mit dem 8-Bit-CRC-Beispiel): a.) Die ersten 8 Bits des Rahmens werden ergänzt
11011010 -> 00100101
c.) Multiplizieren mit x^8 entspricht einer Verschiebung um 8 Bit (mit Nullen aufgefüllt)
00100101 -> 00100101 00000000 = 18688
d.) Teile durch G(x)
und erhalte RestR(x)
18688/7 = 2669 r 5
Update: Ich habe seitdem eine 8-Bit-VHDL-Implementierung mit einer funktionierenden Lookup-Tabelle mit 256 Einträgen. Oder zumindest liefert es die gleichen Ergebnisse wie der Online-Rechner.
Ihr Missverständnis passiert gleich am Anfang. Das als 0x7 angegebene Polynom (in normaler Notation) ist mindestens ein 4-Bit-CRC, der Rechner, auf den Sie verweisen, berechnet einen 8-Bit-CRC.
In der normalen Notation ist das führende Bit des Polynoms 1 und wird weggelassen. Für einen 8-Bit-CRC (wenn wir den Rechner überprüfen wollen) ist das tatsächliche Polynom also nicht nur 111
9 Bit lang, 10000011 1
da das führende 9. Bit in dieser Notation weggelassen wird.
Wenn ich damit rechne:
11011010 00000000
10000011 1
-----------------
01011001 10000000
1000001 11
-----------------
00011000 01000000
10000 0111
-----------------
00001000 00110000
1000 00111
-----------------
00000000 00001000
Voilá, das Ergebnis des Rechners erscheint 0x08.
Wenn es um CRCs geht, spricht man immer von Polynomdivision und nicht von normaler Division mit Rest.
Ich schlage vor, dass Sie sich über die Mathematik dahinter informieren, und da Sie an einer VHDL-Implementierung interessiert sind, denke ich, dass die Berechnungen auch sehr nützlich sind.
Der Schritt a)
entspricht einem Init-Wert im Taschenrechner, FF
falls sich jemand wundert. Wenn dieser Schritt hinzugefügt wird, sieht das Ergebnis so aus:
00100101 00000000
100000 111
-----------------
00000101 11100000
100 000111
-----------------
00000001 11111100
1 00000111
-----------------
00000000 11111011
Das Ergebnis ist also 0xFB. Der im OP verlinkte Taschenrechner liefert diesen Wert nicht (anscheinend kein Standardpolynom). Dieser Rechner ermöglicht es, selbst einen CRC zu definieren. Und wenn ich das CRC-8-Polynom und einen Anfangswert von 0xFF verwende, ist das Ergebnis das folgende:
Also das gleiche wie meine Handrechnung.
Robin