イーサネット パケットのフレーム チェック シーケンス (FCS) をバイトごとに計算しようとしています。多項式は0x104C11DB7
です。ここで見られる XOR-SHIFT アルゴリズムに従いましたhttp://en.wikipedia.org/wiki/Cyclic_redundancy_checkまたはここhttp://www.woodmann.com/fravia/crctut1.htm
CRC を持つと想定される情報が 1 バイトだけであると仮定します。0x03 としましょう。
step: 右に 32 ビットでパディング
0x0300000000
左側の多項式とデータをゼロではない最初のビットに合わせ、それらを xor します
0x300000000 xor 0x209823B6E = 0x109823b6e
残りの位置合わせと xor を再度実行します
0x109823b6e xor 0x104C11DB7 = 0x0d4326d9
もうビットが残っていないので、0x03 の CRC32 は0x0d4326d9
残念ながら、すべてのソフトウェア実装は私が間違っていると言っていますが、何が間違っていたのでしょうか?
Pythonは私に教えてくれます:
"0x%08x" % binascii.crc32(chr(0x03))
0x4b0bbe37
http://www.lammertbies.nl/comm/info/crc-calculation.html#intrのオンライン ツールでも同じ結果が得られます。私の手計算と上記のソフトウェアが使用するアルゴリズムの違いは何ですか?
アップデート:
スタック オーバーフローに関する同様の質問がすでにあったことが判明しました。
あなたはここで答えを見つけますPython CRC-32 woes
これはあまり直感的ではありませんが。イーサネット フレームの処理方法についてより正式な説明が必要な場合は、イーサネット標準ドキュメント 802.3パート 3 - 3.2.9 章 フレーム チェック シーケンス フィールドを参照してください。
上記の例を続けましょう:
メッセージのビット順を逆にします。これは、それらが少しずつ受信機に入る方法を表しています。
0x03
したがって0xC0
メッセージの最初の 32 ビットを補完します。1 バイトを 32 ビットで再度パディングすることに注意してください。
0xC000000000 xor 0xFFFFFFFF = 0x3FFFFFFF00
上記の Xor と shift メソッドをもう一度完了します。約6ステップ後、次のようになります。
0x13822f2d
次に、上記のビット シーケンスが補完されます。
0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2
ステップ 1 でイーサネット ワイヤ上の表現を取得するためにビットの順序を逆にしたことを思い出してください。ここで、このステップを逆にする必要があり、最終的にクエストを完了します。
0x4b0bbe37
このやり方を思いついた人は誰でも...
多くの場合、受け取ったメッセージが正しいかどうかを実際に知りたいと思うでしょう。これを実現するには、FCS を含む受信メッセージを取得し、上記と同じ手順 1 から 5 を実行します。結果は、彼らが残留物と呼ぶものになるはずです。これは、特定の多項式の定数です。この場合は です0xC704DD7B
。
mcdowellaが言及しているように、使用しているアプリケーションに応じて、正しくなるまでビットをいじる必要があります。