2016-07-04 16 views
1

私はあるCにCRC16アルゴリズムを実装しています:CRCアルゴリズムの実装

init = 0x0000 as long as the data stream goes on if the first bit of data is not equal to the first bit of initial value init = leftshift init once and xor it with the polynomial otherwise leftshift init go to the next data bit init = CRC Checksum

今問題がある...私は最初の比較の後に初期化値を変更した場合、それはつもりは常に等しくなりますデータストリーム。例えば

:私は、初期値は最初の反復後

1011 0000 1011 0101

とデータストリーム

0011 0110 1000 0101

であることを取得する場合。

最初は0'sが問題ではなく、無視することができるので、常に等しいと考えられます。

そして次の反復の後に彼らがあることを行っている:それぞれ

011 0000 1011 0101

とデータストリーム

011 0110 1000 0101

が、再び0'sを無視することができ、我々は平等を取得します。

私は本当に混乱しています。

#define POLY 0x8005 

int crc = 0x0000; // Initial value 
char data[1024]; 
int *dp = data; 
int fd, nread; 

fd = open(argv[1], O_RDWR); 
nread = read(fd, data, sizeof(data)); 
int *end = dp + nread; 



while(data < end) 
{ 
    crc = crc & 1 && data & 1 ? crc << 1 : (crc << 1)^POLY; 
    data++; 
} 
+0

同じ表現で '&'と '&& 'を混在させるときの優先順位については確かですか? –

+0

'crc&1 && data&1'が間違っています。 「データの最初のビットが初期値の最初のビットと等しくない場合」に従って「crc&1 == data&1」にする必要があります。論理演算子で本当にそれをしたいのであれば、それは 'xor(not)'であるべきです –

+0

これはコンパイルされません。 'data'は配列ですが、あなたは' data&1'や 'data ++'のようなことをしています。 – interjay

答えて

1

いくつかの問題:あなたは最下位ビットで動作しているが、最上位ビットで作業する必要があります

  1. はここに私のCコードです。これは、あなたが値の間違った終わりを見ているので、同じままになっているビットに関するあなたの混乱の原因となる可能性があります。

  2. crc & 1 && data & 1は、ビットが互いに等しいことをチェックする代わりに、ビットが1であることをチェックする。

  3. あなたはdataが配列(宣言されたように)、整数(data & 1で使用されるような)、又は(data++で使用されるような)ポインタであるか混乱しているように見えます。

  4. ポインタにdataを変更し、各ステップで1ずつ増やすと、各入力バイトから1ビットしか処理していないことになります。すべての8ビットを処理するには、内部ループが必要です。

+0

私はmsbでどのように動作するように切り替えることができますか?一番左のビットか一番右のビットを調べるべきですか? –

+0

@MonsieurMolly一番左のビットで作業する必要があります。 – interjay

関連する問題