私は、8ビットのCRCのこの実装につまずいている:https://stackoverflow.com/a/15171925/243827CRC8アルゴリズムの明確化
誰かがそのテーブルを取得した方法にいくつかの光を当てることができますか?私はcrc8_slow
機能をコメント解除し、4D、D4、A6またはB2に定義されたPOLY
ため
byte crc;
byte data[1] = {0x01};
crc = crc8_slow(0, data, sizeof(data)/sizeof(byte));
printf("0x%.2X", crc);
でそれを供給しようとしています。私はそのテーブルから値を再現するように見えません。また、どのようにシフトレジスタの非0xff初期値に対してそのコードを変更する必要がありますか?
EDIT1:実行したときに
#define POLY 0xB2
byte crc;
byte data[1] = {0x80};
crc = crc8_slow(0, data, sizeof(data)/sizeof(byte));
printf("0x%.2X", crc);
byte crc8_slow(byte crc, byte *data, size_t len)
{
byte *end;
if (len == 0)
return crc;
// crc ^= 0xff;
end = data + len;
do {
crc ^= *data++;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
} while (data < end);
// return crc^0xff;
return crc;
}
は0x01
を生み出します。私はAtmega 8ビットで問題になるでしょう。
「EDIT1」コードが直接実行可能ではありませんが、実行可能作ったとき、それは '0xB2'を与えます。私は 'typedef unsigned char byte;を追加しなければなりませんでした。 –
@MarkAdler nope、すべてを 'unsigned char'に切り替えました - 同じ結果 – kellogs
実行した正確で完全なコードを投稿する必要があります。 –