循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。
CRC校验原理虽然看起来比较复杂,其实也不难理解,其根本思想就是先在要发送的帧后面附加一个数,生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除。这里不是直接采用二进制除法,而是采用一种称之为“模2除法”。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理,所以结果应该是没有余数,结果能够被除数整除。如果有余数,则表明该帧在传输过程中出现了差错。
这里,为了能够对CRC校验有深入了解,我们来介绍一下模2除法。与“算术除法”类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。模2减法运算实际上是按位异或运算。也就是比较后,两者对应位相同则结果为“0”,不同则结果为“1”。如下图所示,二进制的数101000110100000除以110101,结果得到商为1101010110,余数为01110

CRC校验算法,说白了,就是把需要校验的数据与多项式进行循环异或(XOR)。下面举个例子说明一下计算的过程:
使用多项式:x8+x5+x4+1(二进制为:100110001)
计算一个字节:0x11(二进制为:00010001)
计算步骤
A、 将需要计算的数据左移8位,
移位后数据为:0001 0001 0000 000
B、 先进行高9bit异或(多项式为9bit),0001 0001 0000 0000,因为高9bit的
最高bit为0,不需要进行异或,同理,接下来的两bit也是0,也不需要进行进行异或。
这样处理后数据为:1 0001 0000 0000;
C、 接下来最高位为1,需要进行异或操作了

最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



