|
CRC 一、循环冗余码校验英文名称为Cyclical Redundancy * g9 m* ^- P9 B8 L; E1 P3 ^/ q
+ T# x2 {3 B- {7 j5 V% j# K. j9 F0 K
Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error
. k, j& \8 Z8 w6 X y2 f- @$ u7 z3 m' z6 g8 o! @# h9 a
Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。
2 j. k+ `, w. Z
, _+ I4 j& S; b 根据应用环境与习惯的不同,CRC又可分为以下几种标准:
+ d8 P0 j1 G' W1 O$ z9 c, E. X3 j z1 a- t' M
①CRC-12码;
0 X* b1 I1 C8 W! s5 ~4 d, C/ x3 F" o' n6 a9 M
②CRC-16码;
. B. o" d6 U! ?6 A# w6 v) ^* a6 M( T, H5 Z
③CRC-CCITT码;
' t; H" G5 `' O l* |( l% J! [" ]; i- A. ^$ g. I, o
④CRC-32码。0 n- X$ @+ l" a9 o/ _3 Q v
! n9 b" `( t1 \9 [& e* K' k
CRC-12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。6 H6 h( f! X! H2 V3 |/ \0 t
, W# P8 _/ S$ f/ j% {0 L i9 G9 K 下面以最常用的CRC-16为例来说明其生成过程。4 @5 e; T$ i% i, f
0 q* u- Q" a0 o2 A CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。8 H. ?% e; S" G6 K
2 m8 f9 \$ g3 O8 R/ M/ m3 I
下面为CRC的计算过程:% T7 m8 v) f* r+ X
2 Z* m% q5 e* P8 R, S 1.设置CRC寄存器,并给其赋值FFFF(hex)。
- ~6 _& ]. N' A/ ~" B& ]- H8 y( R
# u9 t, y; s- x" s" g1 k 2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。( h/ q" S# J, o! J1 r5 P
$ T0 A' S, O& L 3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。" @) l i! H7 y: z, e
1 U" L; e2 m' H/ v) R b
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。7 a4 h! \! H( U0 g4 F8 Z
A. L* C6 `( u4 u& @% V* v2 @
5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。! k' N7 s" S9 W/ \
4 E& V* R. ^6 c, ~( e$ Q2 H& Z6 [$ J 6.重复第2至第5步直到所有数据全部处理完成。* K1 u _' f& a- A# @1 L. [8 X" K
5 v2 p' P4 [. Y# Z9 T/ P9 g
7.最终CRC寄存器的内容即为CRC值。' {- E* \) y$ C2 r! L! U
, h6 x2 |( u: L$ R
常用的CRC循环冗余校验标准多项式如下:
( ?' X: ^7 z4 b6 }8 T, m; u# y% ]8 B/ t; O6 n8 [0 _( z
CRC(16位) = X16+X15+X2+1
1 h- {7 A* t& `8 ]& F. q' ~2 e7 V0 b2 {7 [" B$ M- n
CRC(CCITT) = X16+X12 +X5+1
& ?: ~- ]1 z" K X7 k
1 W0 H$ `7 ?5 f CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1
: G) w' V0 j" C x k% F* h. ? P8 I, L+ E2 ^) O
以CRC(16位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101。
% |, h X1 |$ N, u8 G' B
* p8 p9 c3 Y: c7 U$ r7 r 注意:这儿列出的标准校验多项式都含有(X+1)的多项式因子;各多项式的系数均为二进制数,所涉及的四则运算仍遵循对二取模的运算规则。 |
|