我執行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
可以忽略不計,我們得到平等對待。
我真的很困惑。
這裏是我的C代碼:
#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