1. 程式人生 > >CRC的校驗原理以及例子

CRC的校驗原理以及例子

一、基本原理

    CRC檢驗原理實際上就是在一個p位二進位制資料序列之後附加一個r位二進位制檢驗碼(序列),從而構成一個總長為npr位的二進位制序列;附加在資料序列之後的這個檢驗碼與資料序列的內容之間存在著某種特定的關係。如果因干擾等原因使資料序列中的某一位或某些位發生錯誤,這種特定關係就會被破壞。因此,通過檢查這一關係,就可以實現對資料正確性的檢驗。

二、幾個基本概念

1、幀檢驗序列FCSFrame Check Sequence):為了進行差錯檢驗而新增的冗餘碼。

2、多項式模2執行:實際上是按位異或(Exclusive OR)運算,即相同為0,相異為1,也就是不考慮進位、借位的二進位制加減運算。如:

10011011 + 11001010 = 01010001

3、生成多項式(generator polynomial):當進行CRC檢驗時,傳送方與接收方需要事先約定一個除數,即生成多項式,一般記作Gx)。生成多項式的最高位與最低位必須是1。常用的CRC碼的生成多項式有:

CRC8=X8+X5+X4+1

CRC-CCITT=X16+X12+X5+1

CRC16=X16+X15+X5+1

CRC12=X12+X11+X3+X2+1

CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1

每一個生成多項式都可以與一個程式碼相對應,如CRC8對應程式碼:100110001

三,生成步驟

1、將X的最高次冪為R的生成多項式G(X)轉換成對應的R+1位二進位制數。

2、將資訊碼左移R位,相當於對應的資訊多項式C(X)*2R

3、用生成多項式(二進位制數)對資訊碼做除,得到R位的餘數。

4、將餘數拼到資訊碼左移後空出的位置,得到完整的CRC碼。

【例】假設使用的生成多項式是G(X)=X3+X+14位的原始報文為1010。


四、CRC檢驗碼的計算

設資訊欄位為K位,校驗欄位為R位,則碼字長度為N(N=K+R)。設雙方事先約定了一個R次多項式g(x),則CRC碼:

V(x)=A(x)g(x)=xRm(x)+r(x)

其中:   m(x)K次資訊多項式,r(x)

R-1次校驗多項式。

這裡r(x)對應的程式碼即為冗餘碼,加在原資訊欄位後即形成CRC碼。

r(x)的計算方法為:在K位資訊欄位的後面新增R0,再除以g(x)對應的程式碼序列,得到的餘數即為r(x)對應的程式碼(應為R1位;若不足,而在高位補0)

計算示例:

設需要傳送的資訊為M = 1010001101CRC8=X5+X4+X2+1產生多項式對應的程式碼為P = 110101R5。在M後加50為計算序列:101000110100000,然後對P做模2除法運算,得餘數r(x)對應的程式碼:01110。故實際需要傳送的資料是101000110101110。其中CRC校驗碼就為:01110。

 

五、錯誤檢測

    當接收方收到資料後,用收到的資料對P(事先約定的)進行模2除法,若餘數為0,則認為資料傳輸無差錯;若餘數不為0,則認為資料傳輸出現了錯誤,由於不知道錯誤發生在什麼地方,因而不能進行自動糾正,一般的做法是丟棄接收的資料。

註釋 幾點說明:

    1CRC是一種常用的檢錯碼,並不能用於自動糾錯。

    2、只要經過嚴格的挑選,並使用位數足夠多的除數P,那麼出現檢測不到的差錯的概率就很小很小。

    3、僅用迴圈冗餘檢驗 CRC 差錯檢測技術只能做到無差錯接受(只是非常近似的認為是無差錯的),並不能保證可靠傳輸。