私はある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++;
}
同じ表現で '&'と '&& 'を混在させるときの優先順位については確かですか? –
'crc&1 && data&1'が間違っています。 「データの最初のビットが初期値の最初のビットと等しくない場合」に従って「crc&1 == data&1」にする必要があります。論理演算子で本当にそれをしたいのであれば、それは 'xor(not)'であるべきです –
これはコンパイルされません。 'data'は配列ですが、あなたは' data&1'や 'data ++'のようなことをしています。 – interjay