1. 程式人生 > >Linux日常——CRC校驗

Linux日常——CRC校驗

CRC
即迴圈冗餘校驗碼(Cyclic Redundancy Check[1] ):是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊欄位和校驗欄位的長度可以任意選定。
迴圈冗餘檢查(CRC)是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。
位元在傳輸過程中可能產生差錯:1可能會變成0,0可能變成1,這叫位元差錯。它是傳輸差錯中的一種。
誤位元速率:傳輸錯誤的位元佔所傳輸位元總數的比率。
所以為了保證資料傳輸的可靠性,在計算機網路傳輸資料時,必須採用各種差錯檢驗措施。
校驗原理:
在K位資訊碼後再拼接R位的校驗碼,整個編碼長度為N位,因此,這種編碼也叫(N,K)碼。對於一個給定的(N,K)碼,可以證明存在一個最高次冪為N-K=R的多項式P(x)。根據P(x)可以生成K位資訊的校驗碼,而G(x)叫做這個CRC碼的生成多項式。
任意一個由二進位制位串組成的程式碼都可以和一個係數僅為‘0’和‘1’取值的多項式一一對應。例如:程式碼1010111對應的多項式為x6+x4+x2+x+1,而多項式為x5+x3+x2+x+1對應的程式碼101111。
校驗碼的具體生成過程為:


在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運算就是在資料M後新增供差錯檢驗的n為冗餘碼
在資料端,將資料劃分為組,假設每組K 個位元。現在傳輸資料M
M=101001 , K = 6
生成多項式假設為:P(X)=X^3+x^2+X^0
以下為n位冗餘碼的計算方法:

補多項式最高次冪個0:101001000
多項式生成除數P: 1101
X^3+x^2+0+X^0
1 1 0 1
二進位制模2運算:
這裡寫圖片描述
得到冗餘碼為:001
所以最後傳送出的幀為:101001001
在接收端把收到的資料以幀為但單位進行CRC檢驗,把收到的每一個幀都除以同樣的除數P(模2運算),然後檢查得到的餘數R。
R=0,傳輸中無差錯,接受
R!=0,出現差錯,丟棄