迴圈冗餘檢驗 CRC 演算法原理

2021-04-21 06:43:35 字數 3282 閱讀 4033

cyclic redundancy check迴圈冗餘檢驗,是基於資料計算一組效驗碼,用於核對資料傳輸過程中是否被更改或傳輸錯誤。

假設資料傳輸過程中需要傳送15位的二進位制資訊g=101001110100001,這串二進位製碼可表示為代數多項式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k位的值,對應g(x)中x^k的係數。將g(x)乘以x^m,既將g後加m個0,然後除以m階多項式h(x),得到的(m-1)階餘項r(x)對應的二進位製碼r就是crc編碼。

h(x)可以自由選擇或者使用國際通行標準,一般按照h(x)的階數m,將crc演算法稱為crc-m,比如crc-32、crc-64等。國際通行標準可以參看http://en.wikipedia.org/wiki/cyclic_redundancy_check

g(x)和h(x)的除運算,可以通過g和h做xor(異或)運算。比如將11001與10101做xor運算:

明白了xor運算法則後,舉乙個例子使用crc-8演算法求101001110100001的效驗碼。crc-8標準的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二進位制串111010101。 

經過迭代運算後,最終得到的r是10001100,這就是crc效驗碼。

通過示例,可以發現一些規律,依據這些規律調整演算法: 

1. 每次迭代,根據gk的首位決定b,b是與gk進行運算的二進位製碼。若gk的首位是1,則b=h;若gk的首位是0,則b=0,或者跳過此次迭代,上面的例子中就是碰到0後直接跳到後面的非零位。

2. 每次迭代,gk的首位將會被移出,所以只需考慮第2位後計算即可。這樣就可以捨棄h的首位,將b取h的後m位。比如crc-8的h是111010101,b只需是11010101。 

3. 每次迭代,受到影響的是gk的前m位,所以構建乙個m位的暫存器s,此暫存器儲存gk的前m位。每次迭代計算前先將s的首位拋棄,將暫存器左移一位,同時將g的後一位加入暫存器。若使用此種方法,計算步驟如下: 

※藍色表示暫存器s的首位,是需要移出的,b根據s的首位選擇0或者h。黃色是需要移入暫存器的位。s'是經過位移後的s。

同樣是上面的那個例子,將資料按每4位組成1個block,這樣g就被分成6個block。

下面的表展示了4次迭代計算步驟,灰色背景的位是儲存在暫存器中的。 

經4次迭代,b1被移出暫存器。被移出的部分,不我們關心的,我們關心的是這4次迭代對b2和b3產生了什麼影響。注意表中紅色的部分,先作如下定義:

b23 = 00111010

b1 = 00000000

b2 = 01010100

b3 = 10101010

b4 = 11010101

b' = b1 xor b2 xor b3 xor b4

4次迭代對b2和b3來說,實際上就是讓它們與b1,b2,b3,b4做了xor計算,既:

b23 xor b1 xor b2 xor b3 xor b4

可以證明xor運算滿足交換律和結合律,於是:

b23 xor b1 xor b2 xor b3 xor b4 = b23 xor (b1 xor b2 xor b3 xor b4) = b23 xor b'

b1是由b1的第1位決定的,b2是由b1迭代1次後的第2位決定(既是由b1的第1和第2位決定),同理,b3和b4都是由b1決定。通過b1就可以計算出b'。另外,b1由4位組成,其一共2^4有種可能值。於是我們就可以想到一種更快捷的演算法,事先將b'所有可能的值,16個值可以看成乙個表;這樣就可以不必進行那4次迭代,而是用b1查表得到b'值,將b1移出,b3移入,與b'計算,然後是下一次迭代。

可看到每次迭代,暫存器中的資料以4位為單位移入和移出,關鍵是通過暫存器前4位查表獲得

,這樣的演算法可以大大提高運算速度。

上面的方法是半位元組查表法,另外還有單位元組和雙位元組查表法,原理都是一樣的——事先計算出2^8或2^16個b'的可能值,迭代中使用暫存器前8位或16位查表獲得b'。

之前討論的演算法可以稱為正向crc演算法,意思是將g左邊的位看作是高位,右邊的位看作低位。g的右邊加m個0,然後迭代計算是從高位開始,逐步將低位加入到暫存器中。在實際的資料傳送過程中,是一邊接收資料,一邊計算crc碼,正向演算法將新接收的資料看作低位。

逆向演算法顧名思義就是將左邊的資料看作低位,右邊的資料看作高位。這樣的話需要在g的左邊加m個0,h也要逆向,例如正向crc-16演算法h=0x4c11db8,逆向crc-16演算法h=0xedb88320。b的選擇0還是h,由暫存器中右邊第1位決定,而不是左邊第1位。暫存器仍舊是向左位移,就是說迭代變成從低位到高位。

迴圈冗餘檢驗 CRC 演算法原理

cyclic redundancy check迴圈冗餘檢驗,是基於資料計算一組效驗碼,用於核對資料傳輸過程中是否被更改或傳輸錯誤。假設資料傳輸過程中需要傳送15位的二進位制資訊g 101001110100001,這串二進位製碼可表示為代數多項式g x x 14 x 12 x 9 x 8 x 7 x ...

迴圈冗餘檢驗 CRC 演算法原理

cyclic redundancy check迴圈冗餘檢驗,是基於資料計算一組效驗碼,用於核對資料傳輸過程中是否被更改或傳輸錯誤。假設資料傳輸過程中需要傳送15位的二進位制資訊g 101001110100001,這串二進位製碼可表示為代數多項式g x x 14 x 12 x 9 x 8 x 7 x ...

迴圈冗餘檢驗 CRC 演算法原理

cyclic redundancy check迴圈冗餘檢驗,是基於資料計算一組效驗碼,用於核對資料傳輸過程中是否被更改或傳輸錯誤。假設資料傳輸過程中需要傳送15位的二進位制資訊g 101001110100001,這串二進位製碼可表示為代數多項式g x x 14 x 12 x 9 x 8 x 7 x ...