1

IEEE 802.3 から引用

数学的には、特定の MAC フレームに対応する CRC 値は、次の手順で定義されます。

a) フレームの最初の 32 ビットが補完されます。
b) 次に、保護されたフィールドの n ビットは、次数 n – 1 の多項式 M(x) の係数であると見なされます。 MAC クライアント データ フィールド (存在する場合はパッド フィールド) の最後のビットは、
x0項に対応します。31.
d) R(x) の係数は、32 ビットのシーケンスと見なされます。
e) ビット シーケンスが補完され、その結果が CRC になります。

https://www.kernel.org/doc/Documentation/crc32.txt

この方法で書かれたビッグエンディアン CRC は、次のようにコーディングされます。

for (i = 0; i < input_bits; i++) {
    multiple = remainder & 0x80000000 ? CRCPOLY : 0;
    remainder = (remainder << 1 | next_input_bit()) ^ multiple;
}

パートc) M(x) に x^32 を掛けたものはどこですか? どの数値にも 32 個のゼロが追加されているのがわかりません。

また、次のコードは意味がありません。コードと数学は実際には一致しません。

CRC-32 実装の違いを評価し

unsigned short
crc16_update(unsigned short crc, unsigned char nextByte)
{
    crc ^= nextByte;

    for (int i = 0; i < 8; ++i) {
        if (crc & 1)
            crc = (crc >> 1) ^ 0xA001;
        else
            crc = (crc >> 1);
    }

    return crc;
}

これらの実装は何をしていますか? それらのどれも、元の手順に実際には似ていません。

これを最後まで読んだ後でも、まだ意味がありません: http://www.relisoft.com/science/crcmath.html

4

1 に答える 1