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 個のゼロが追加されているのがわかりません。
また、次のコードは意味がありません。コードと数学は実際には一致しません。
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