【CRC算法】CRC算法、原理及程序

 

 

CRC算法及原理

http://www.cnblogs.com/FPGA_DSP/archive/2010/05/08/1730529.html?login=1

CRC算法及原理

 

CRC校验码的基本思想是利用线性编码理论, 在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
   
在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25FCS(帧检错序列)采用的是CRC. CCITTARJLHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIFTIFF等也都用CRC作为检错手段。
    CRC
的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。通常,CRC的除数用生成多项式来表示。最常用的CRC码的生成多项式有CRC16,CRC32.
   
CRC16为例,16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以2^16)后,再除以一个多项式,最后所得到的余数既是CRC码,如下式所示,其中K(X)表示n位的二进制序列数,G(X)为多项式,Q(X)为整数,R(X)是余数(既CRC码)。
K(X)>>16=G(x)Q(x)+R(x)
   
CRC码所采用模2加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。生成CRC码的多项式如下,其中CRC-16CRC-CCITT产生16位的CRC码,而CRC-32则产生的是32位的CRC
   
接收方将接收到的二进制序列数(包括信息码和CRC码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件计算CRC码时,接收方可以将接收到的信息码求CRC码,比较结果和接收到的CRC码是否相同。
   
CCITT推荐的高级数据链路控制规程HDLC的帧校验序列FCS中,使用CCITT-16CRC16,其生成多项式为G(x)=x16+x12+x5+1, CRC-32的生成多项式为G(x)=x32+x26+x23+x22+x16+x11+x10+x16+x8+x7+x5+x4+x2+x+1
CRC算法原理及C语言实现

CRC原理介绍:

 CRC的英文全称为Cyclic Redundancy Check(Code),中文名称为循环冗余校验(码)。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。 


     CRC计算与普通的除法计算有所不同。普通的除法计算是借位相减的,而CRC计算则是异或运算。任何一个除法运算都需要选取一个除数,在CRC运算中我们称之为poly,而宽度W就是poly最高位的位置。比如poly 1001的W是3,而不是4。注意最高位总是1,当你选定一个宽度,那么你只需要选择低W各位的值。假如我们想计算一个位串的CRC码,并要保证每一位都要被处理,因此我们需要在目标位串后面加上W个0。下面举例说明CRC算法的过程。

     在此例中,我们假设位串为110101101。

Poly
                     = 10011(宽度W = 4)
Bitstring + W zeros = 110101101 0000

10011/1101011010000/110000101 (我们不关心此运算的商)
      10011|||||||| 
       -----||||||||
        10011|||||||
        10011|||||||
         -----|||||||
          00001||||||
          00000||||||
           -----||||||
            00010|||||
            00000|||||
             -----|||||
              00101||||
              00000||||
               -----||||
                01010|||
                00000||| 
                 -----|||
                  10100||
                  10011||
                   -----||
                    01110|
                    00000|
                     -----|
                     11100
                     10011
                      -----
                       1111 -> 余数 -> CRC!

计算过程总结如下:
1. 只有当位串的最高位为1,我们才将它与poly做XOR运算,否则我们只是将位串左移一位。
2. 异或运算的结果实质上是被操作位串与poly的低W位进行运算的结果,因为最高位总为0。 

 


posted on 2022-10-04 01:31  bdy  阅读(535)  评论(0编辑  收藏  举报

导航