CRC校验码计算

CRC校验


一、什么是CRC校验

循环冗余校验码(CRC),简称循环码,是一种常用的、具有检错、纠错能力的校验码。
使用场景:在要发送的帧加入校验码,组成新帧,发送新帧,在接收端判断接收到的帧中的校验码是否正确,如果正确,那么表示接收到的信号正确。

二、如何计算校验码

根据要校验的位计算校验码
如何计算校验码
计算过程

  1. 数据:明确需要计算校验码的帧,明确生成多项式
  2. 前反转:明确是否需要将输入的原始数据进行逆序处理
    若需要对原始数据进行逆序处理,即True,则对每一个字节进行逆序处理;若不需要,即false,则保持不变
  3. 初始值:明确初始值
    将初始值与前反转的结果进行异或处理
  4. 进行模2除法运算求余
  5. 后反转:明确是否需要将求出来的余数进行逆序处理
    若需要,则对整个数据进行逆序处理
  6. 输出异或
    将后反转的结果与输出异或值进行异或处理

因此,可以得出,CRC校验结果受到生成多项式、初始值、输入数据,输入输出反转,输出异或的影响。

例子:在这里插入图片描述

左移算法与右移算法

右移算法是指将数据向右移动若干位。在CRC校验中,右移算法通常来模拟多项式除法中的除以2的操作,左移则为乘以2的操作。由于在计算机的计算过程中,右移操作只需要将数据向右移动指定的位数,并用0填充左侧空出的位,这可以通过基本的移位指令来实现。相比之下,左移提出需要将数据向左移动,由于在左移过程中,右侧可能需要填充0为,这就需要额外的步骤完成。这种步骤会消耗更多的资源,因此在计算机中,右移算法比左移动算法更加常见。讲回到我们的CRC校验,我们所常见的CRC校验的计算方式通常是仅进行模2除法来计算,参考上一章节的例子,这种运算往往是我们常见的左移算法。但是在计算机中,由于右移算法比左移算法更加常见,因此在我们常见的左移运算中加入前后反转,这样就可以在计算机中使用右移运算得到我们需要的结果了。

在上一章介绍如何计算校验码时,我们已经介绍了左移算法,并给出示例,接下来我们将用同样的生成多项式&初始数据&输出异或值,但不同的是使用右移算法来计算,目的是得出相同的结果。
在这里插入图片描述
可以看到,以上右移算法计算出来的结果和左移算法完全一致。值得注意的是,在使用右移算法的时候,在左移算法之前进行了前反转,之后进行了后反转的情况下,右移算法不需要这样的操作,仅需要右移计算即可。除此之外,右移算法在使用生成多项式的时候需要和数据右边进行对齐,其生成多项式需要在表达式中从右向左写。在本例中,生成多项式为10010,在计算时就用的是01001,上图中左边给出了错误的生成多项式计算,右边为正确计算。

代码

在git上边找到的代码https://gitee.com/anyangchina/crc_all

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值