Linux CRC校验码

1、CRC简介:

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中常用的一种差错校验码,其特征是信息字段和校验字段的长度

可以任意选定。CRC校验实用程序库在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。

crc校验原理:

利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码列,以一定的规则产生一个校验用的r位监督码(CRC码),

附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,

以确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”。

2、生成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 

你可能感兴趣的:(Linux)