循环冗余码校验英文名称为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值。
解决方案 »
- 为什么会出错这样的事务错误
- 关于FAST REPORT的问题[悬赏50]
- 如何用delphi调用word后,禁用word里的所有的菜单和工具栏除了关闭,
- 散分,对Microsoft Speech SDK SAPI 5.1(TTS)有兴趣的同胞进来坐坐
- 假设一个表有n条纪录,我要从中随机抽取m条不重复的纪录,求助算法.(m<n)
- 有做过USB通讯的吗?
- 有人说:“软件开发就是制造问题,然后解决问题”,大家谈谈看法!顺便散点分!
- 急!DELPHI编写动态连接库问题!
- 今天的第二贴,各位大虾进来讨论讨论~~~~~~~~~~~~~~~~
- 在我的程序中怎样关闭另一应用程序(知道它的主窗口的类名)?
- 关于DataGrid和WebBrowser共存的问题!非常奇怪!
- 程序在退出时将触发什么事件
生成式 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的突发错的9999 8%、长度为18以上的突发错的99997%。CRC-16和CRC-CCITT可以用硬件实现。 (4)CRC编码硬件电路的实现设 数据1010多项式 生成多项式系数1011 多项式系数1010000 多项式 余式系数011多项式k(X)=X+1CRC编码 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
首先介绍其原理,如果每次参与CRC计算的信息为一个字节,该信息字节加到16位的累加器中去时,只有累加器的高8位或低8位与信息字节相互作用(异或),相互作用(异或)的结果记为组合值,那么累加器中的新值等于组合值加上(按模2异或)累加器中未改变的那一半即为新的CRC值。
组合值只有256种可能,因此可利用硬件模拟算法先算好它们的CRC值预先填入一张表中,该表的每一单元对应相对值的CRC。这样就可以通过查表法来计算CRC值,以便大大提高CRC运算的速度。