0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从技术层面解析CRC循环冗余算法原理

jf_35136247 来源:jf_35136247 作者:jf_35136247 2023-05-06 14:33 次阅读

Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于核对CRC循环冗余算法数据传输过程中是否被更改或传输错误。

算法原理

假设数据传输过程中需要发送15位的二进制信息g=101001110100001,这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k位的值,对应g(x)中x^k的系数。将g(x)乘以x^m,既将g后加m个0,然后除以m阶多项式h(x),得到的(m-1)阶余项r(x)对应的二进制码r就是CRC编码。

h(x)可以自由选择或者使用国际通行标准,一般按照h(x)的阶数m,将CRC算法称为CRC-m,比如CRC-32、CRC-64等。

g(x)和h(x)的除运算,可以通过g和h做xor(异或)运算。

比如将11001与10101做xor运算:

明白了xor运算法则后,举一个例子使用CRC-8算法求101001110100001的效验码。CRC-8标准的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二进制串111010101。

经过迭代运算后,最终得到的r是10001100,这就是CRC效验码。

通过示例,可以发现一些规律,依据这些规律调整算法:

  1. 每次迭代,根据gk的首位决定b,b是与gk进行运算的二进制码。若gk的首位是1,则b=h;若gk的首位是0,则b=0,或者跳过此次迭代,上面的例子中就是碰到0后直接跳到后面的非零位。
  2. 每次迭代,gk的首位将会被移出,所以只需考虑第2位后计算即可。这样就可以舍弃h的首位,将b取h的后m位。比如CRC-8的h是111010101,b只需是11010101。
  3. 每次迭代,受到影响的是gk的前m位,所以构建一个m位的寄存器S,此寄存器储存gk的前m位。每次迭代计算前先将S的首位抛弃,将寄存器左移一位,同时将g的后一位加入寄存器。若使用此种方法,计算步骤如下:

※蓝色表示寄存器S的首位,是需要移出的,b根据S的首位选择0或者h。黄色是需要移入寄存器的位。S'是经过位移后的S。

查表法

同样是上面的那个例子,将数据按每4位组成1个block,这样g就被分成6个block。

下面的表展示了4次迭代计算步骤,灰色背景的位是保存在寄存器中的。

经4次迭代,B1被移出寄存器。被移出的部分,不我们关心的,我们关心的是这4次迭代对B2和B3产生了什么影响。注意表中红色的部分,先作如下定义:

B23 = 00111010

b1 = 00000000

b2 = 01010100

b3 = 10101010

b4 = 11010101

b' = b1 xor b2 xor b3 xor b4

4次迭代对B2和B3来说,实际上就是让它们与b1,b2,b3,b4做了xor计算,既:

B23 xor b1 xor b2 xor b3 xor b4

可以证明xor运算满足交换律和结合律,于是:

B23 xor b1 xor b2 xor b3 xor b4 = B23 xor (b1 xor b2 xor b3 xor b4) = B23 xor b'

b1是由B1的第1位决定的,b2是由B1迭代1次后的第2位决定(既是由B1的第1和第2位决定),同理,b3和b4都是由B1决定。通过B1就可以计算出b'。另外,B1由4位组成,其一共2^4有种可能值。于是我们就可以想到一种更快捷的算法,事先将b'所有可能的值,16个值可以看成一个表;这样就可以不必进行那4次迭代,而是用B1查表得到b'值,将B1移出,B3移入,与b'计算,然后是下一次迭代。

可看到每次迭代,寄存器中的数据以4位为单位移入和移出,关键是通过寄存器前4位查表获得

,这样的算法可以大大提高运算速度。

上面的方法是半字节查表法,另外还有单字节和双字节查表法,原理都是一样的——事先计算出2^8或2^16个b'的可能值,迭代中使用寄存器前8位或16位查表获得b'。

CRC循环冗余反向算法

之前讨论的算法可以称为正向CRC算法,意思是将g左边的位看作是高位,右边的位看作低位。G的右边加m个0,然后迭代计算是从高位开始,逐步将低位加入到寄存器中。在实际的数据传送过程中,是一边接收数据,一边计算CRC码,正向算法将新接收的数据看作低位。

CRC循环冗余逆向算法顾名思义就是将左边的数据看作低位,右边的数据看作高位。这样的话需要在g的左边加m个0,h也要逆向,例如正向CRC-16算法h=0x4c11db8,逆向CRC-16算法h=0xedb88320。b的选择0还是h,由寄存器中右边第1位决定,而不是左边第1位。寄存器仍旧是向左位移,就是说迭代变成从低位到高位。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5342

    浏览量

    120277
  • crc
    crc
    +关注

    关注

    0

    文章

    199

    浏览量

    29462
  • 循环冗余
    +关注

    关注

    0

    文章

    3

    浏览量

    6842
收藏 人收藏

    评论

    相关推荐

    原理到代码理解CRC循环冗余校验

    本文详细介绍了CRC循环冗余计算的数学原理,算法中使用的参数说明,并以Modbus协议中的CRC-16
    的头像 发表于 01-29 09:00 2125次阅读
    <b class='flag-5'>从</b>原理到代码理解<b class='flag-5'>CRC</b><b class='flag-5'>循环</b><b class='flag-5'>冗余</b>校验

    PSoC 4 循环冗余校验 (CRC)

    循环冗余校验 (CRC) 组件的默认用途是根据任意长度的串行比特流计算 CRC。在数据时钟的上升沿上对输入数据进行采样。在启动前,CRC
    发表于 07-04 11:30

    CRC循环冗余校验的算法

    想问下51单片机和所有嵌入式中一个很基本也很常见的问题,CRC循环冗余校验的算法中生成多项式为什么要那样取(有个生成多项式的表格),如果信息段中一位或多位传输错误,校验段是怎样保证唯一
    发表于 01-21 21:02

    转:循环冗余校验(CRC算法入门引导

    写给嵌入式程序员的循环冗余校验(CRC算法入门引导前言CRC校验(循环
    发表于 08-01 18:32

    循环冗余校验(CRC算法入门引导

    循环冗余校验(CRC算法入门引导
    发表于 08-17 12:40

    如何利用循环冗余校验(CRC)计算单元进行传输数据的校验呢

    循环冗余校验(CRC)计算单元是什么?如何利用循环冗余校验(CRC)计算单元进行传输数据的校验呢
    发表于 12-15 06:04

    循环冗余校验码---CRC

    循环冗余校验码---CRC码   二进制信息位串沿一条信号线逐位在部件之间或计算机之间传送称为串行传送。CRC(Cyclic Redundancy c
    发表于 10-13 16:52 7178次阅读
    <b class='flag-5'>循环</b><b class='flag-5'>冗余</b>校验码---<b class='flag-5'>CRC</b>码

    STM32L4循环冗余校验模块(CRC)介绍

    STM32L4循环冗余校验模块(CRC)介绍 有兴趣的可以参考下
    发表于 12-25 10:38 27次下载

    crc循环冗余校验码算法

     循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作
    发表于 12-04 10:11 2.3w次阅读
    <b class='flag-5'>crc</b><b class='flag-5'>循环</b><b class='flag-5'>冗余</b>校验码<b class='flag-5'>算法</b>

    CRC循环冗余算法原理详细讲解

    Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。
    发表于 05-23 15:06 1.2w次阅读
    <b class='flag-5'>CRC</b><b class='flag-5'>循环</b><b class='flag-5'>冗余</b><b class='flag-5'>算法</b>原理详细讲解

    PIC24F系列参考手册之可编程循环冗余校验(CRC

    本文主要介绍了PIC24F系列参考手册之可编程循环冗余校验(CRC)。
    发表于 06-25 03:20 0次下载
    PIC24F系列参考手册之可编程<b class='flag-5'>循环</b><b class='flag-5'>冗余</b>校验(<b class='flag-5'>CRC</b>)

    并行循环冗余校验算法

    循环冗余码校验(CRC)是一种众所周知的错误检测代码,已广泛用于以太网,PCIe和其他传输协议中。现有的基于FPGA的实现解决方案在高性能场景中会遇到资源过度利用的问题。填充零问题和可编程性的引入
    的头像 发表于 02-08 16:42 1956次阅读
    并行<b class='flag-5'>循环</b><b class='flag-5'>冗余</b>校验<b class='flag-5'>算法</b>

    CRC循环冗余校验简介

    CRC 是Cyclic Redundancy Check的缩写,循环冗余校验,用于校验数据传输的完整性。一般情况下在数据发送前计算CRC校验值,附在发送数据之后,数据接收方也按照同样方
    的头像 发表于 04-24 13:04 7008次阅读
    <b class='flag-5'>CRC</b><b class='flag-5'>循环</b><b class='flag-5'>冗余</b>校验简介

    32位可编程循环冗余校验(CRC)

    电子发烧友网站提供《32位可编程循环冗余校验(CRC).pdf》资料免费下载
    发表于 09-25 11:22 0次下载
    32位可编程<b class='flag-5'>循环</b><b class='flag-5'>冗余</b>校验(<b class='flag-5'>CRC</b>)

    CRC循环冗余校验)应用举例

    CRC循环冗余校验)应用举例
    的头像 发表于 05-16 16:12 1186次阅读