1、循環(huán)校驗碼(CRC碼):是數(shù)據通信領域中最常用的一種差錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。
2、生成CRC碼的基本原理:任意一個由二進制位串組成的代碼都可以和一個系數(shù)僅為‘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
發(fā)送方通過指定的g(x)產生CRC碼字,接收方則通過該g(x)來驗證收到的CRC碼字。
標準CRC生成多項式如下表:
名稱 生成多項式 簡記式* 標準引用
CRC-4 x4+x+1 3 ITU G.704
CRC-8 x8+x5+x4+1 0x31
CRC-8 x8+x2+x1+1 0x07
CRC-8 x8+x6+x4+x3+x2+x1 0x5E
CRC-12 x12+x11+x3+x+1 80F
CRC-16 x16+x15+x2+1 8005 IBM SDLC
CRC16-CCITT x16+x12+x5+1 1021 ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS
CRC-32 x32+x26+x23+...+x2+x+1 04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS
CRC-32c x32+x28+x27+...+x8+x6+1 1EDC6F41 SCTP
基本算法(人工筆算):
以CRC16-CCITT為例進行說明,CRC校驗碼為16位,生成多項式17位。假如數(shù)據流為4字節(jié):BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0];
數(shù)據流左移16位,相當于擴大256×256倍,再除以生成多項式0x11021,做不借位的除法運算(相當于按位異或),所得的余數(shù)就是CRC校驗碼。
發(fā)送時的數(shù)據流為6字節(jié):BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0]、CRC[1]、CRC[0];
舉例:
信息字段代碼為: m(x)=x6+x4+x3+1 代碼為:1011001
生成多項式: g(x)=x4+x3+1 代碼為:11001
m(x)x4=x10+x8+x7+x4 對應的代碼記為:10110010000 即 左移4位
m(x)x4 在與 g(x)進行 模2的除法運算,相當于按位異或,計算過程如下:
1 0 1 1 0 0 1 0 0 0 0
1 1 0 0 1
-----------------------------
0 1 1 1 1 0 1 0 0 0 0
1 1 0 0 1
-----------------------------
0 0 0 1 1 1 1 0 0 0 0
1 1 0 0 1
-----------------------------
0 0 1 1 1 0 0 0
1 1 0 0 1
-----------------------------
0 0 1 0 1 0 --------------> 余數(shù) 即 校驗碼
發(fā)送數(shù)據碼為: 10110011010