Ethernet CRC32-Berechnung - software-vs-Algorithmische Ergebnis

Ich versuche zu berechnen, die Frame Check Sequence (FCS) ein Ethernet-Paket byte für byte. Das Polynom ist 0x104C11DB7.
Ich folgte dem XOR-SHIFT-Algorithmus, der hier zu sehen http://en.wikipedia.org/wiki/Cyclic_redundancy_check oder hier http://www.woodmann.com/fravia/crctut1.htm

Davon ausgehen, die Informationen, soll eine CRC ist nur ein byte. Lassen Sie uns sagen, es ist 0x03.

  1. Schritt: pad mit 32 bits nach rechts

    0x0300000000

  2. richten Sie das Polynom und die Daten auf der linken Seite mit dem ersten bit ungleich null und xor Ihnen

    0x300000000 xor 0x209823B6E = 0x109823b6e

  3. nehmen Rest ausrichten und xor wieder

    0x109823b6e xor 0x104C11DB7 = 0x0d4326d9

Da gibt es keine mehr, etwas Links der CRC32 von 0x03 sollte 0x0d4326d9

Leider alle software-Implementierungen sagen mir, ich bin falsch, aber was habe ich falsch gemacht oder was werden Sie anders machen?

Python sagt mir:

 "0x%08x" % binascii.crc32(chr(0x03))
 0x4b0bbe37

Dem online-tool hier http://www.lammertbies.nl/comm/info/crc-calculation.html#intr erhält das gleiche Ergebnis.
Was ist der Unterschied zwischen meiner hand Berechnung und der Algorithmus der software verwendet?

UPDATE:

Stellt sich heraus, es war eine ähnliche Frage bereits auf stack overflow:

Finden Sie hier eine Antwort Python CRC-32 woes

Obwohl dies nicht sehr intuitiv. Wenn Sie möchten, eine formale Beschreibung, wie es gemacht wird für Ethernet-frames können Sie die Ethernet-Standard 802.3 Dokument Teil 3 - Kapitel 3.2.9 Frame Check Sequence-Feld

Können weiterhin das Beispiel von oben:

  1. Umgekehrter bit-Reihenfolge Ihrer Meldung. Das ist der Weg, Sie kommen in den receiver etwas.

    0x03 daher ist 0xC0

  2. Ergänzen die ersten 32 bit der Nachricht. Beachten Sie, dass wir Schreibblock die Einzel-byte mit 32 bit wieder.

    0xC000000000 xor 0xFFFFFFFF = 0x3FFFFFFF00

  3. Runden das Xor-und shift-Methode von oben wieder. Nach etwa 6 Schritt erhalten Sie:

    0x13822f2d

  4. Den oben genannten bit-sequense wird dann ergänzt.

    0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2

  5. Denken Sie daran, dass wir die umgekehrte bit-Reihenfolge, um die Darstellung auf dem Ethernet-Kabel in Schritt eins. Jetzt haben wir eine umgekehrte Schritt, und wir endlich die Erfüllung unserer quest.

    0x4b0bbe37

Wer kam auf diese Weise zu tun, es sein sollte ...

Eine Menge Zeit, Sie wirklich wollen, zu wissen, es die Nachricht, die Sie erhalten ist korrekt. Um dies zu erreichen, nehmen Sie die empfangene Nachricht einschließlich der FCS und führen Sie den gleichen Schritt 1 bis 5 wie oben. Das Ergebnis sollte sein, was Sie nennen Rückstand. Die ist eine Konstante für ein gegebenes Polynom. In diesem Fall ist es 0xC704DD7B.

Als mcdowella erwähnt, Sie haben zu spielen, um mit Ihren bits, bis Sie es richtig machen, je nach Anwendung, die Sie verwenden.

InformationsquelleAutor der Frage sebs | 2012-02-15

Schreibe einen Kommentar