最好懂的CRC校验规则讲解

前言

  • CRC校验的原理非常复杂,但是用起来却很简单,甚至别人写好了函数,直接拿来调用即可,但是我们还是需要了解一点这个校验码是如何计算得来的
  • 网上的教程一大堆,但是很多讲的太深入,让人看的云里雾里,不明所以,所以我才想写一个高中生都能看懂的,不那么深入的,专注于应用的,通俗易懂的CRC校验的解释

何为校验

比如我写了一封电子邮件给你,它是用二进制写的,比如说是1010 1010

当你收到的时候,发现信息是1010 1011

很明显最后一位被篡改了,但是你如何知道接收的信息是否有问题呢,这就需要校验机制

使用校验机制的结果,就是在要发送的数据之后,再接着发一串校验码

在串口通信中用的最多的就是奇偶校验,所谓奇偶校验,其实是两种校验方式,一种叫奇校验,一种叫偶校验,它们有什么区别呢

  • 奇校验:要发送的二进制数据中,保证1的个数为奇数,如果有效信息有偶数个1,则校验位为1
  • 偶校验:要发送的二进制数据中,保证1的个数为偶数,如果有效信息有奇数个1,则校验位为1

如果刚刚我要发的电子邮件,采用偶校验,那么1010 1010中1的个数为4,是偶数,所以最后校验位是0,所以最终发送出去的数据是1010 1010 0

CRC校验也是如此,它会在原始数据的末尾,再加上一串校验位,这串校验位是利用原始数据,通过固定的算法计算得到的,发送方和接收方,都遵循同样的算法,如果传输过程无误,接收方收到的信息没有被篡改,则接收方可以利用这个算法,计算出校验码,再去跟发送方的校验码进行比较,相同的话则认为接收的数据没有问题(你可以这样去理解,但是实际它不是这样做的)

如何生成CRC校验码

还是上面的例子,要发送的信息为1010 1010,十六进制为0xAA

采用CRC-4/ITU校验,校验码长度4位

在这里插入图片描述

可以看到得到的结果是1011,计算这个结果的过程很复杂,我先大致介绍怎么得到这个结果,后面再详细解释计算过程

  • 先将1010 1010原始信息码按字节位反转,得到0101 0101
  • 将位反转后的结果左移4位, 空出校验码的位置,得到0101 0101 0000
  • CRC-4/ITU的生成多项式是x^4 + x + 1,对应二进制是10011
  • 进行模二除法运算,被除数是0101 0101 0000,除数是10011,最终得到余数1101
  • 将余数进行按字节位反转,得到1011,这就是最终校验码的结果

上面的过程可能不太好懂,所以我后面会详细解释

按字节位反转

反转其实很简单,例如一段文字“张三李四王五”,反转之后就是“五王四李三张”

一段二进制“1010 0111”,反转过来就是“1110 0101”

至于按字节反转,其实是考虑到如果要校验的信息很长,有多个字节,例如“0101 1101 1010 1001”

它有两个字节,就要在每个字节内做反转,但是字节与字节之间的前后位置,是不变的

“0101 1101 1010 1001”按字节反转后,得到“1011 1010 1001 0101”

确定左移多少位

左移的位数跟采用的CRC算法类型有关系,CRC校验有很多种算法,下面举几个例子

名称生成多项式数值式
CRC-4x4+x+11 0010
CRC-8x8 +x5+x4+11 0011 0001
CRC-12x12+x11+x3+x2+x+11 1000 0000 1111
CRC-16x16+x15+x2+11 1000 0000 0000 0101

其实生成多项式可以是多种多样的,比如说CRC-8的生成多项式,其实并不是只有这一种,但是所有的生成多项式都要遵循一些基本的规定,具体怎么规定,就不细说了,你确定了要采用哪种CRC校验后,知道要去网上查表找它的生成多项式就行了

从表中可以看出,CRC-4,它的x4一定是存在的,同样的,CRC-8,它是x8一定是存在的,这个数值4或者8,就是这种校验方式最后生成校验码的位数

知道了校验码位数,就知道了需要左移多少位

生成多项式的数值式

以上的表中,还有一项是数值式,它是将多项式的系数提取出来,组成一串二进制的数
例如CRC-4

名称生成多项式数值式
CRC-4x^4 + x + 110011

生成多项式里面,有很多项是系数0,如果把它写完整,将会是

1 * x^4 + 0 * x^3 + 0 * x^2 + 1 * x ^1 + 1 * x^0

提取多项式的系数,得到10011

模二除法

所谓模二除法,本质上是异或运算,这里用xor表示异或

0 xor 0 = 0
1 xor 1 = 0
1 xor 0 = 1
0 xor 1 = 1

发现异或运算的规律了吗,相同则为0,相异则为1

下面来计算刚刚的例子,0101 0101 0000 模二除 10011

第一步先写好被除数和除数
在这里插入图片描述

第二步,将除数写到下面,进行异或运算
如果被除数的最高位为0,那么除数要放的位置,就要往右移,每次计算前,都要看被除数最高位是不是0,这步操作因为最高位是1,所以除数放的位置右移了1位
进行异或运算,就是上下对应的每一位,都按异或进行计算,不需要考虑借位、进位等问题
这一步得到的结果是110,为了做下一步运算,把被除数后面的位依次拿下来,得到11001
在这里插入图片描述

然后,重复第二步的操作,直到除尽,得到最终的余数为1101
在这里插入图片描述

将这个数按字节位反转,得到1011,这便是最终的校验码

其它说明

在这里插入图片描述

在选择一种CRC校验方式之前,一定要知道它有哪些具体规定,例如CRC-4/ITU,它的输入和输出数据反转,是被强制勾选的,所以计算的时候要格外注意

如果是做题,会发现很多规定,例如这个反转,在题目里面是没有的,根本不需要做这个操作,所以自己一定要看清楚它的要求

  • 39
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值