轉載地址:http://blog.sina.com.cn/s/blog_5d2412000100cp3y.html
1、循環校驗碼(CRC碼):是數據通信領域中最常用的一種差錯校驗碼,其特徵是信息字段和校驗字段的長度可以任意選定。
2、生成CRC碼的基本原理:任意一個由二進制位串組成的代碼都可以和一個係數僅爲‘0’和‘1’取值的多項式一一對應。例如:代碼1010111對應的多項式爲x6+x4+x2+x+1,而多項式爲x5+x3+x2+x+1對應的代碼101111。
3、CRC碼集選擇的原則:若設碼字長度爲N,信息字段爲K位,校驗字段爲R位(N=K+R),則對於CRC碼集中的任一碼字,存在且僅存在一個R次多項式g(x),使得
V(x)=A(x)g(x)=xRm(x)+r(x);
其中: m(x)爲K次信息多項式, r(x)爲R-1次校驗多項式,
g(x)稱爲生成多項式:
g(x)=g0+g1x+ g2x2+...+g(R-1)x(R-1)+gRxR
發送方通過指定的g(x)產生CRC碼字,接收方則通過該g(x)來驗證收到的CRC碼字。
4、CRC校驗碼軟件生成方法:
藉助於多項式除法,其餘數爲校驗字段。
例如:信息字段代碼爲: 1011001;對應m(x)=x6+x4+x3+1
假設生成多項式爲:g(x)=x4+x3+1;則對應g(x)的代碼爲: 11001
x4m(x)=x10+x8+x7+x4 對應的代碼記爲:10110010000;
採用多項式除法: 得餘數爲: 1010 (即校驗字段爲:1010)
發送方:發出的傳輸字段爲: 1 0 1 1 0 0 1 1 0 10
信息字段 校驗字段
接收方:使用相同的生成碼進行校驗:接收到的字段/生成碼(二進制除法)如果能夠除盡,則正確,
CRC(Cyclic Redundancy Check)循環冗餘校驗碼
是常用的校驗碼,在早期的通信中運用廣泛,因爲早期的通信技術不夠可靠(不可靠性的來源是通信技術決定的,比如電磁波通信時受雷電等因素的影響),不可靠的通信就會帶來‘確認信息’的困惑,書上提到紅軍和藍軍通信聯合進攻山下的敵軍的例子,第一天紅軍發了條信息要藍軍第二天一起進攻,藍軍收到之後,發一條確認信息,但是藍軍擔心的是‘確認信息’如果也不可靠而沒有成功到達紅軍那裏,那自己不是很危險?於是紅軍再發一條‘對確認的確認信息’,但同樣的問題還是不能解決,紅軍仍然不敢貿然行動。
對通信的可靠性檢查就需要‘校驗’,校驗是從數據本身進行檢查,它依靠某種數學上約定的形式進行檢查,校驗的結果是可靠或不可靠,如果可靠就對數據進行處理,如果不可靠,就丟棄重發或者進行修復。
CRC碼是由兩部分組成,前部分是信息碼,就是需要校驗的信息,後部分是校驗碼,如果CRC碼共長n個bit,信息碼長k個bit,就稱爲(n,k)碼。它的編碼規則是:
1、首先將原信息碼(kbit)左移r位(k+r=n)
2、運用一個生成多項式g(x)(也可看成二進制數)用模2除上面的式子,得到的餘數就是校驗碼。
非常簡單,要說明的:模2除就是在除的過程中用模2加,模2加實際上就是我們熟悉的異或運算,就是加法不考慮進位,公式是:
0+0=1+1=0,1+0=0+1=1
即‘異’則真,‘非異’則假。
由此得到定理:a+b+b=a 也就是‘模2減’和‘模2加’真值表完全相同。
有了加減法就可以用來定義模2除法,於是就可以用生成多項式g(x)生成CRC校驗碼。
例如: g(x)=x4+x3+x2+1,(7,3)碼,信息碼110產生的CRC碼就是:
對於g(x)=x4+x3+x2+1的解釋:(都是從右往左數)x4就是第五位是1,因爲沒有x1所以第2位就是0。
11101 | 110,0000(設a=11101 ,b=1100000)
取b的前5位11000跟a異或得到101
101加上b沒有取到的00得到10100
然後跟a異或得到01001
也就是餘數1001
101
11101 | 110,0000
111 01
1 0100
1 1101
1001
餘數是1001,所以CRC碼是110,1001
標準的CRC碼是,CRC-CCITT和CRC-16,它們的生成多項式是:
CRC-CCITT=x^16+x^12+x^5+1
CRC-16=x^16+x^15+x^2+1
先舉個例子:
已知信息位爲1100,生成多項式G(x) = x3+x+1,求CRC碼。
M(x) = 1100 M(x)*x3 = 1100000
G(x) = 1011
M(x)*x3 / G(x) = 1110 + 010 /1011
R(x) = 010
CRC碼爲: M(x)*x 3+R(x)=1100000+010 =1100010
其原理是:CRC碼一般在k位信息位之後拼接r位校驗位生成。編碼步驟如下:
(1)將待編碼的k位信息表示成多項式 M(x)。
(2)將 M(x)左移 r 位,得到 M(x)*xr 。
(3)用r+1位的生成多項式G(x)去除M(x)*xr 得到餘數R(x)。
(4)將M(x)*xr 與R(x)作模2加,得到CRC碼。
“模2除”的演示圖片:
“模2除”中間過程的減法爲“模2減”,即異或運算。