CRC循环校验

http://www.360doc.com/content/10/0408/22/1102209_22179091.shtml

 

循环校验码(CRC码):

是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。

生成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码字。

标准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位。假如数据流为4字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0];

数据流左移16位,相当于扩大256×256倍,再除以生成多项式0x11021,做不借位的除法运算(相当于按位异或),所得的余数就是CRC校验码。

发送时的数据流为6字节: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             --------------> 余数     即 校验码



发送数据码为: 10110011010



猜你喜欢

转载自nemogu.iteye.com/blog/1522132