循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。 根据应用环境与习惯的不同,CRC又可分为以下几种标准:   ①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的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的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值。 
 
 

解决方案 »

  1.   

    循环码(CRC) (1)循环码是一种重要的线性码,它有三个主要数学特征: ①循环码具有循环性,即循环码中任一码组循环一位(将最右端的码移至左端)以后,仍为 该码中的一个码组。 ②循环码组中任两个码组之和(模2)必定为该码组集合中的一个码组。 ③循环码每个码组中,各码元之间还存在一个循环依赖关系,b代表码元,则有  (2)用多项式码作为检验码的编解码过程 用多项式码作为检验码时,发送器和接收器必须具有相同的生成多项式(Generator Polynom ial)G(x),其最高、最低项系数必须为1。CRC编码过程是将要发送的二进制序列看作是多项 式的系数,除以生成多项式,然后把余数挂在原多项式之后。CRC译码过程是接收方用同一 生成多项式除以接收到的CRC编码,若余数为零,则传输无错。 编码译码方法: ①令r为生成多项式G(x)的阶,将r个“0”附加在信息(数据)元的低端,使其长度变为k+r 位,相应于多项式; ②,得余数; ③与余数对应位异或,得编码信息T(x)。 例 数据信息 数据信息  1101011011 M(X) 
    生成式 10011 G(X),R=4 
    加4个“0”之后  11010110110000  
    /G(X) 1110 余数 
    待发送的编码 11010110111110 T(X)  ④接收器收到发来的编码信息后,用同一个生成多项式G(x)除以编码信息,若余数为零, 则表示接收到正确的编码信息,否则有错。 ⑤把收到的正确编码信息T(x)去掉尾部r位,即得数据信息M(x)。 (3)多项式码检错能力及生成多项式G(x)的选择原则 设接收到的信息不是发送的编码信息T(x),而是T(x)+E(x)。 例 有差错的编码信息为 1001001011 T(x)-E(x)=T(x)+E(x) 其中,1101011011 为T(x)0100010000 为E(x) 若接收到的有差错的编码信息为T(x)+E(x),用G(x)除以T(x)+E(x),则得余数为E(x)/G(x) 的余数,因为T(x)/G(x)余数为零,所以 [T(x)+E(x)]/G(x)E(x)/G(x) 这时应该有余数,若无余数则检不出错。 有r位校验位的多项式码将能检测所有≤r位的突发错,故只要k-1<r,就能检测出所有突发 错,这是一个很有用的结论。 生成多项式G(x)的国际标准有: CRC-12  
    CRC-16 
    CRC-CCITT CRC-16和CRC-CCITT两种生成多项式生成的CRC码可以捕捉一位错、二位错、具有奇数个错 的全部错误,可以捕捉突发错长度小于16的全部错误、长度为17的突发错的9999 8%、长度为18以上的突发错的99997%。CRC-16和CRC-CCITT可以用硬件实现。 (4)CRC编码硬件电路的实现设 数据1010多项式 生成多项式系数1011 多项式系数1010000 多项式 余式系数011多项式k(X)=X+1CRC编码 1010 001 
    信息 监督 信息组从高位端输入的CRC编码电路,如图6-6所示,其工作原理是:首先门1关闭,门2开 通,依次输入的信息元1010一面经或门H直接输出,同时送往除法电路进行除法运算。4次移 位后除法电路完成了运算,得余式系数为“011”,即为监督元。第5个移位脉冲开始门1 开通,门2关闭,断开了反馈,移位3次把移位寄存器中的3位余项作为监督元附在信息元后 面,发出的码字就是1010011,最后门1关闭,门2开通,对下一信息组再行编码。有关工作 过程见表6-5  表6-5 图6-6所示电路的工作过程移动脉冲 输入  输出 注 
    (初始状态)   000  } 门1关闭 
          
    1 1 011 门2打开 
    2 0 110 
    3 1 100 } 门1打开 
    4 0 011 
    5 0 110 门2关闭 
    6 0 100 
    7 0 000 
      

  2.   

    简述CRC算法原理,给出一种新颖快速的查表计算方法,并给出用C语言编写的算法源程序。关键词:CRC、多项式、查表法  在编写数据传输程序时,数据容错是一个非常重要的问题。循环冗余位校验(Cyclicl Redundncy Check英文简称CRC)是目前运用非常广泛的一种数据容错方法,在数据传输,数据压缩等领域运用极其广泛。CRC的实现分为硬件和软件两种方法,其中软件实现的关键在于计算速度。如果单纯模拟硬件实现方法,则计算速度较慢。笔者在编制一个数据通讯软件中,运用了一种新颖的查表法计算CRC,速度很快,效果极佳。
      首先介绍其原理,如果每次参与CRC计算的信息为一个字节,该信息字节加到16位的累加器中去时,只有累加器的高8位或低8位与信息字节相互作用(异或),相互作用(异或)的结果记为组合值,那么累加器中的新值等于组合值加上(按模2异或)累加器中未改变的那一半即为新的CRC值。
      组合值只有256种可能,因此可利用硬件模拟算法先算好它们的CRC值预先填入一张表中,该表的每一单元对应相对值的CRC。这样就可以通过查表法来计算CRC值,以便大大提高CRC运算的速度。
      

  3.   

    我有呵呵,delphi版的给个邮箱先