2017-01-29 14 views
0

私は、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ビットで問題になるでしょう。

+0

「EDIT1」コードが直接実行可能ではありませんが、実行可能作ったとき、それは '0xB2'を与えます。私は 'typedef unsigned char byte;を追加しなければなりませんでした。 –

+0

@MarkAdler nope、すべてを 'unsigned char'に切り替えました - 同じ結果 – kellogs

+0

実行した正確で完全なコードを投稿する必要があります。 –

答えて

1

Polyは逆順になり、次に右に1ビットシフトして0xB2になります。 crcはbit reflectedで、左シフトの代わりに右シフトを使用します。あなたはcrc8_table[0x80]を見れば

101001101  0x14d 
101100101  0x14d bit reversed = 0x165 
10110010  0x14d bit reversed >> 1 = 0xB2 

は、あなたが0xB2が表示されます。各行の長さは12バイトで、インデックス0x80は、128なので、0x1dで始まる10番目の行を見て、8番目のバイト(その行の最初のバイトは120)を参照して、0xB2を参照してください。

私はこのコードをテストし、それがコード(0xB2)を出力します。

#include <stdio.h> 
typedef unsigned char byte; 
#define POLY    0xB2 

// prototype 
byte crc8_slow(byte crc, byte *data, size_t len); 

int main(){ 
    byte crc; 
    byte data[1] = {0x80}; 
    crc = crc8_slow(0, data, sizeof(data)/sizeof(byte)); 
    printf("0x%.2X", crc); 
    return 0; 
} 

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; 
} 
+0

は間違い、有益で紛らわしい:)。私の編集をチェックできますか? – kellogs

+0

ok、それは私の8ビットアーキテクチャと多分関係があります。もう少し詳しく見ていきます。ありがとうございました! – kellogs

2

この表は、最初と最後の排他的論理和なしのシングルバイト0..255のcrc8_slow()です。そのコードは既にが0xb2と定義されています。これは、指定された多項式(0x4dビットが反転したもの)の反映です。

最初のレジスタ値が0で、最終的な排他的論理和がない別のCRC-8定義では、コードから2つの排他的論理和を削除するだけです。

crcanyを見ると、特定の仕様のCRCコードが生成されます。