轉自 http://blog.csdn.net/u012993936/article/details/45337069
一、CRC簡介
先在此說明下什么是CRC:循環冗余碼校驗 英文名稱為Cyclical Redundancy Check,簡稱CRC,它是利用除法及余數的原理來作錯誤偵測(Error Detecting)的。實際應用時,發送裝置計算出CRC值並隨數據一同發送給接收裝置,接收裝置對收到的數據重新計算CRC並與收到的CRC相比較, 若兩個CRC值不同,則說明數據通訊出現錯誤
那么其實CRC有比較多種,比如CRC16、CRC32 ,為什么叫16、32呢。在這里並非與位有和關系。而是由所確定的多項式最高次冪確定的。如下所示。理論上講冪次越高校驗效果越好。
CRC(12位) =X12+X11+X3+X2+X+1
CRC(16位) = X16+X15+X2+1
CRC(CCITT) = X16+X12 +X5+1
CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1
二、循環冗余校驗碼(CRC)的基本原理:
在K位信息碼后再拼接R位的校驗碼,整個編碼長度為N位,因此,這種編碼又叫(N,K)碼。對於一個給定的(N,K)碼,可以證明存在一個最高次冪為N-K=R的多項式G(x)。根據G(x)可以生成K位信息的校驗碼,而G(x)叫做這個CRC碼的生成多項式。
校驗碼的具體生成過程為:假設發送信息用信息多項式C(X)表示,將C(x)左移R位,則可表示成C(x)*2R,這樣C(x)的右邊就會空出R位,這就是校驗碼的位置。通過C(x)*2R除以生成多項式G(x)得到的余數就是校驗碼。
原理思維導圖總結:
三、通信與網絡中常用的CRC
在數據通信與網絡中,通常k相當大,由一千甚至數千數據位構成一幀,而后采 用CRC碼產生r位的校驗位。它只能檢測出錯誤,而不能糾正錯誤。一般取r=16,標准的16位生成多項式有CRC-16=x16+x15+x2+1 和 CRC-CCITT=x16+x15+x2+1。
一般情況下,r位生成多項式產生的CRC碼可檢測出所有的雙錯、奇數位錯和突發長度小於等於r的突發錯以及(1-2-(r-1))的突發長度為r+1的突 發錯和(1-2-r)的突發長度大於r+1的突發錯。例如,對上述r=16的情況,就能檢測出所有突發長度小於等於16的突發錯以及99.997%的突發 長度為17的突發錯和99.998%的突發長度大於17的突發錯。所以CRC碼的檢錯能力還是很強的。這里,突發錯誤是指幾乎是連續發生的一串錯,突發長 度就是指從出錯的第一位到出錯的最后一位的長度(但是,中間並不一定每一位都錯)。
【例1】某循環冗余碼(CRC)的生成多項式 G(x)=x3+x2+1,用此生成多項式產生的冗余位,加在信息位后形成 CRC 碼。若發送信息位 1111 和 1100 則它的 CRC 碼分別為_A_和_B_。由於某種原因,使接收端收到了按某種規律可判斷為出錯的 CRC 碼,例如碼字_C_、_D_、和_E_。(1998年試題11)
供選擇的答案:
A:① lllll00 ② 1111101 ③ 1111110 ④ 1111111
B:① 1100100 ② 1100101 ③ 1100110 ④ 1100111
C~E:① 0000000 ② 0001100 ③ 0010111 ⑤ 1000110 ⑥ 1001111 ⑦ 1010001 ⑧ 1011000
解:
A:G(x)=1101,C(x)=1111 C(x)*23÷G(x)=1111000÷1101=1011余111
得到的CRC碼為1111111
B:G(x)=1101,C(x)=1100 C(x)*23÷G(x)=1100000÷1101=1001余101
得到的CRC碼為1100101
C~E:
分別用G(x)=1101對①~⑧ 作模2除: ① 0000000÷1101 余000 ② 1111101÷1101 余001
③ 0010111÷1101 余000 ④ 0011010÷1101 余000 ⑤ 1000110÷1101 余000
⑥ 1001111÷1101 余100 ⑦ 1010001÷1101 余000 ⑧ 1011000÷1101 余100
所以_C_、_D_和_E_的答案是②、⑥、⑧
【例2】計算機中常用的一種檢錯碼是CRC,即 _A_ 碼。在進行編碼過程中要使用 _B_ 運算。假設使用的生成多項式是 G(X)=X4+X3+X+1, 原始報文為11001010101,則編碼后的報文為 _C_ 。CRC碼 _D_ 的說法是正確的。
在無線電通信中常采用它規定碼字長為7位.並且其中總有且僅有3個“1”。這種碼的編碼效率為_E_。
供選擇的答案:
A:① 水平垂直奇偶校驗 ② 循環求和 ③ 循環冗余 ④正比率
B:① 模2除法 ②定點二進制除法 ③二-十進制除法 ④循環移位法
C:① 1100101010111 ② 110010101010011 ③ 110010101011100 ④ 110010101010101
D:① 可糾正一位差錯 ②可檢測所有偶數位錯
③ 可檢測所有小於校驗位長度的突發錯 ④可檢測所有小於、等於校驗位長度的突發錯
E:① 3/7 ② 4/7 ③ log23/log27 ④ (log235)/7
解:從前面有關CRC的論述中可得出: A:③ 循環冗余 B:① 模2除法
C:G(x)=11011,C(x)=11001010101,C(x)*24÷G(x)=110010101010000÷11011 余0011
得到的CRC碼為② 110010101010011
D:從前面有關通信與網絡中常用的CRC的論述中可得出:④ 可檢測所有小於、等於校驗位長度的突發錯
E:定比碼又叫定重碼,是奇偶校驗的推廣。在定比碼中,奇數或偶數的性質保持不變,然而附加一種限制,每個字中1的總數是固定的。隨用途之不同,定比碼要求的附加校驗位可能多於一個,但較之單一的奇偶校驗將增加更多的檢錯能力。
所謂7中取3定比碼,就是整個碼字長度為7位,其中1的位數固定為3。所有128個7位代碼(0000000~1111111)中只有1的位數固定為3的 才是其合法碼字。可以用求組合的公式求出其合法碼字數為:C73=7!/(3!*(7-3)!)=7*6*5/(1*2*3)=35
編碼效率=合法碼字所需位數/碼字總位數=(log235)/7
而對於CRC的實現有兩種方式,分別為多項式和查表法。