2016-07-04 168 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可以忽略不計,我們得到平等對待。

我真的很困惑。

這裏是我的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++; 
} 
+0

你確定在'&'與'&&'在同一個表達式中混合使用''的優先順序嗎? –

+0

'crc&1 && data&1'是錯誤的。根據「如果第一位數據不等於初始值的第一位」,它應該是'crc&1 == data&1'。如果你真的想用邏輯運算符來做,它應該是'xor(not)' –

+0

這甚至不會編譯。 'data'是一個數組,但是你正在做'data&1'和'data ++'之類的事情。 – interjay

回答

1

幾個問題:

  1. 你最不顯著位操作,但應工作的最顯著位。這可能是什麼導致你對位保持不變的困惑,因爲你正在看錯誤的值。

  2. crc & 1 && data & 1檢查該位是否等於1而不是檢查它們是否相等。

  3. 你似乎上data是否是一個數組(如聲明),(如在data & 1使用)的整數,或指針(如在data++使用)相混淆。

  4. 如果您將data更改爲指針並在每一步將其增量爲1,那麼這意味着您只能從每個輸入字節處理一位。你需要一個內部循環來處理所有8位數據。

+0

我不太明白它如何切換到MSB操作。我應該看看最左側還是最右側? –

+0

@MonsieurMolly你應該在最左邊的位上工作。 – interjay