|
CRC 一、循环冗余码校验英文名称为Cyclical Redundancy + @% t) d! [' u8 H. x( {; \
/ a( M; Z$ F) _$ P- p$ ?, E3 a
Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error
; I4 H, |. g! x% [- R4 [' v
: D9 J; P+ h' Z2 H' h Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。
. c* J$ `& S2 b( z5 a' W& Q, O* B4 [5 M( d F. E
根据应用环境与习惯的不同,CRC又可分为以下几种标准:
- V* C0 r' S& n( X* q5 c
( @, {7 P$ }4 y' k ①CRC-12码;8 s1 }3 q7 K4 m i7 @- z$ ]
4 }. u! q7 X: l2 p2 h1 c* ^+ v
②CRC-16码;
6 ^3 c; l! C" ?/ K* l5 B3 |& e4 v; ~# A1 a+ Y
③CRC-CCITT码;
( k& g* t7 k; D5 G W! ]! }
/ ?, C: I; a( M+ _, ]5 u. a ④CRC-32码。. }* G- _6 @! Z. J: Y- c3 b3 T0 x
- k' Y* c( m6 S2 c CRC-12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。! W. _: G3 ^9 q8 O2 ^. u. N
% ?; J1 f6 i! b
下面以最常用的CRC-16为例来说明其生成过程。4 L7 W; W# l$ y! c5 a6 G
9 T( S8 G2 V/ ^( p7 R* ~9 L( x; F CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。" V/ H/ |, g, S$ t' \
0 I9 N) h- K f" p z+ M 下面为CRC的计算过程:# V- M7 v, h g7 h: M1 E! K1 k
2 `/ d: y' Z8 s0 q 1.设置CRC寄存器,并给其赋值FFFF(hex)。& A4 e4 c$ I+ u! S
- n0 u4 T% h9 F' Z* M
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
; H4 H* y& u6 T9 I2 S+ ?$ M
1 C, M) ?$ H: v7 m 3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。* K& i! ?) d+ f, a/ ]# x
, R4 H8 E" f( a: m
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。" n/ p2 {/ R) \) b& {4 D
5 \6 d& }1 r/ K I0 B' |& I 5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
8 E5 ]$ M l/ F) M: X( q3 D; p* C* ~! W; k j2 A
6.重复第2至第5步直到所有数据全部处理完成。
+ a& m% F9 v, z B# Z
5 k# \+ v' W3 u6 F7 M 7.最终CRC寄存器的内容即为CRC值。8 l$ I b8 C+ }# A5 M% Y: `
" {8 X9 S/ r; d# Z 常用的CRC循环冗余校验标准多项式如下:
$ A% E5 |" J; w3 x" V2 ` C5 B. H4 L5 R
CRC(16位) = X16+X15+X2+1 , e- X3 v9 ]3 c; E7 x
8 U$ a" q! w: S3 E- g& \
CRC(CCITT) = X16+X12 +X5+1 2 ^( }9 O! \% y; v: S1 S* f
# @. V. |4 y6 W, d CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1
& k4 b( h5 w$ ?3 ~( k; j- \7 G. o/ Y8 F1 e4 Y# ?' M/ q
以CRC(16位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101。 , L9 | W# Y8 z" f. i4 M, E
# ^; ~4 C( I0 T 注意:这儿列出的标准校验多项式都含有(X+1)的多项式因子;各多项式的系数均为二进制数,所涉及的四则运算仍遵循对二取模的运算规则。 |
|