15

イーサネット パケットのフレーム チェック シーケンス (FCS) をバイトごとに計算しようとしています。多項式は0x104C11DB7です。ここで見られる XOR-SHIFT アルゴリズムに従いましたhttp://en.wikipedia.org/wiki/Cyclic_redundancy_checkまたはここhttp://www.woodmann.com/fravia/crctut1.htm

CRC を持つと想定される情報が 1 バイトだけであると仮定します。0x03 としましょう。

  1. step: 右に 32 ビットでパディング

    0x0300000000

  2. 左側の多項式とデータをゼロではない最初のビットに合わせ、それらを xor します

    0x300000000 xor 0x209823B6E = 0x109823b6e

  3. 残りの位置合わせと 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 章 フレーム チェック シーケンス フィールドを参照してください。

上記の例を続けましょう:

  1. メッセージのビット順を逆にします。これは、それらが少しずつ受信機に入る方法を表しています。

    0x03したがって0xC0

  2. メッセージの最初の 32 ビットを補完します。1 バイトを 32 ビットで再度パディングすることに注意してください。

    0xC000000000 xor 0xFFFFFFFF = 0x3FFFFFFF00

  3. 上記の Xor と shift メソッドをもう一度完了します。約6ステップ後、次のようになります。

    0x13822f2d

  4. 次に、上記のビット シーケンスが補完されます。

    0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2

  5. ステップ 1 でイーサネット ワイヤ上の表現を取得するためにビットの順序を逆にしたことを思い出してください。ここで、このステップを逆にする必要があり、最終的にクエストを完了します。

    0x4b0bbe37

このやり方を思いついた人は誰でも...

多くの場合、受け取ったメッセージが正しいかどうかを実際に知りたいと思うでしょう。これを実現するには、FCS を含む受信メッセージを取得し、上記と同じ手順 1 から 5 を実行します。結果は、彼らが残留物と呼ぶものになるはずです。これは、特定の多項式の定数です。この場合は です0xC704DD7B

mcdowellaが言及しているように、使用しているアプリケーションに応じて、正しくなるまでビットをいじる必要があります。

4

4 に答える 4

9

このスニペットは、イーサネットの正しい CRC を書き込みます。

パイソン3

# write payload
for byte in data:
    f.write(f'{byte:02X}\n')
# write FCS
crc = zlib.crc32(data) & 0xFFFF_FFFF
for i in range(4):
    byte = (crc >> (8*i)) & 0xFF
    f.write(f'{byte:02X}\n')

パイソン 2

# write payload
for byte in data:
    f.write('%02X\n' % ord(byte))
# write FCS
crc = zlib.crc32(data) & 0xFFFFFFFF
for i in range(4):
    byte = (crc >> (8*i)) & 0xFF
    f.write('%02X\n' % byte)

ここでこれを見つけていれば、時間を節約できたでしょう。

于 2013-11-18T10:31:47.937 に答える
4

実行する必要のあることを正確に読み取ることは決してないため、CRC計算を一致させるには、一般に少し試行錯誤が必要です。入力バイトまたは多項式をビットリバースする必要がある場合もあれば、ゼロ以外の値から開始する必要がある場合もあります。

これを回避する1つの方法は、 http://sourceforge.net/projects/crcmod/files/などのプログラムのソースを確認することです(少なくとも一致すると主張しており、このための単体テストが付属しています)。

もう1つは、実装をいじることです。たとえば、http: //www.lammertbies.nl/comm/info/crc-calculation.html#intrで計算機を使用すると、00000000を指定すると0x2144DF1CのCRCが生成されますが、FFFFFFFFを指定するとFFFFFFFFが生成されます。したがって、0がチェックサム0を持つ、あなたが説明する多項式の除算ではありません。

ソースコードとこれらの結果を一目見ただけで、0xFFFFFFFFのCRCから始める必要があると思いますが、間違っている可能性があり、対応するprintfsを使用してコードを実装と並行してデバッグし、場所を見つけることができます。最初は異なり、違いを1つずつ修正します。

于 2012-02-15T06:21:45.597 に答える
3

インターネット上には、FCS を計算する前にビット順序を逆にする必要があると書かれている場所がたくさんありますが、802.3 仕様はその 1 つではありません。仕様の2008年版からの引用:

3.2.9 Frame Check Sequence (FCS) field

A cyclic redundancy check (CRC) is used by the transmit and receive algorithms to
generate a CRC value for the FCS field. The FCS field contains a 4-octet (32-bit)
CRC value. This value is computed as a function of the contents of the protected
fields of the MAC frame: the Destination Address, Source Address, Length/ Type 
field, MAC Client Data, and Pad (that is, all fields except FCS). The encoding is
defined by the following generating polynomial.

  G(x) = x32 + x26 + x23 + x22 + x16 + x12 + x11 
             + x10 + x8 + x7 + x5 + x4 + x2 + x + 1

Mathematically, the CRC value corresponding to a given MAC frame is defined by 
the following procedure:

a) The first 32 bits of the frame are complemented.
b) The n bits of the protected fields are then considered to be the coefficients
   of a polynomial M(x) of degree n – 1. (The first bit of the Destination Address
   field corresponds to the x(n–1) term and the last bit of the MAC Client Data 
   field (or Pad field if present) corresponds to the x0 term.)
c) M(x) is multiplied by x32 and divided by G(x), producing a remainder R(x) of
   degree ≤ 31.
d) The coefficients of R(x) are considered to be a 32-bit sequence.
e) The bit sequence is complemented and the result is the CRC.

The 32 bits of the CRC value are placed in the FCS field so that the x31 term is
the left-most bit of the first octet, and the x0 term is the right most bit of the
last octet. (The bits of the CRC are thus transmitted in the order x31, x30,..., 
x1, x0.) See Hammond, et al. [B37].

確かに、フレーム内の残りのビットは逆の順序で送信されますが、これには FCS は含まれません。繰り返しますが、仕様から:

3.3 Order of bit transmission

Each octet of the MAC frame, with the exception of the FCS, is transmitted least
significant bit first.
于 2013-08-10T20:01:01.530 に答える
2

http://en.wikipedia.org/wiki/Cyclic_redundancy_check

イーサネットのすべてのデータと豊富な重要な詳細があります。たとえば、多項式を32ビット値にエンコードするための(少なくとも)2つの規則があり、最大項が最初か最小項が最初です。

于 2012-02-15T11:58:45.307 に答える