CRC标准及计算过程

  • 格式:doc
  • 大小:29.50 KB
  • 文档页数:3

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CRC标准及计算过程

根据应用环境与习惯的不同,CRC又可分为以下几种标准:

①CRC-8码;

②CRC-12码;

③CRC-16码;

④CRC-CCITT码;

⑤CRC-32码。

CRC-12码通常用来传送6-bit字符串。

CRC-16及CRC-CCITT码则是用来传送8-bit字符串,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。

CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。

生成过程

下面以最常用的CRC-16为例来说明其生成过程。

CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或(异或:二进制运算相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0),之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。

计算过程

1.设置CRC寄存器,并给其赋值FFFF(hex)。

2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC 寄存器。

3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。

4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。

5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。

6.重复第2至第5步直到所有数据全部处理完成。

7.最终CRC寄存器的内容即为CRC值。

常用的CRC循环冗余校验标准多项式如下:

CRC( 8位) = X8 + X2 + X1 + 1

CRC(12位) =X12+X11+X3+X2+X+1

CRC(16位) = X16+X15+X2+1

CRC(CCITT) = X16+X12 +X5+1

CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1

以CRC(16位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101。

注意:这儿列出的标准校验多项式都含有(X+1)的多项式因子;各多项式的系数均为二进制数,所涉及的四则运算仍遵循对二取模的运算规则。

(注:对二取模的四则运算指参与运算的两个二进制数各位之间凡涉及加减运算时均进行XOR异或运算,即:1 XOR 1=0,0 XOR 0=0,1 XOR 0=1,0 XOR 1=1,即相同为0,不同为1)

附:CRC8校验算法(C语言实现)

typedef unsigned long DWORD;

typedef unsigned short WORD;

typedef unsigned char BYTE;

#define AL2_FCS_COEF (( 1 << 7 ) + ( 1 << 6 ) + ( 1 << 5 ))

BYTE GetCrc8(unsigned char *data, int length)

{

BYTE cFcs = 0;

int i = 0;

int j = 0;

for( i = 0; i < length; i++ )

{

cFcs ^= data[i];

for(j = 0; j < 8; j++)

{

if( cFcs & 1 )

{

cFcs = (BYTE)((cFcs >> 1) ^ AL2_FCS_COEF);

}

else

{

cFcs >>= 1;

}

}

}

return cFcs; }