【CRC】CRC推导(四)算法优化

前面讲到模二除法,本节将模二除法的优化。

优化一、首先我们以多项式为0x11021(实际上就是CRC16 CCITT)为例,根据模二除法规则,算法如下:

【CRC】CRC推导(四)算法优化_第1张图片

 

模二算法每一次计算的余数都是比多项式少一个bit,最后的余数也是如此,因为最高位的1始终会被消除,因此,我们在计算时可以不用考虑高位。假设多项式还是0x11021,我们每次只需要处理0x1021,即16位寄存器的数据即可。

【CRC】CRC推导(四)算法优化_第2张图片

 

优化二、模二算法每次都是数据的一个bit移到crc寄存器最低位,寄存器高位移出。

我们每次移动8bit,效果如下:

很明显,最前面多出16个0,多了额外的处理。如何能让数据直接进入寄存器?

我们可以将新的数据先与crc寄存器高位异或,再左移8bit。这样最终数据前面就没有0了。

【CRC】CRC推导(四)算法优化_第3张图片

 

优化后的算法如下:

【CRC】CRC推导(四)算法优化_第4张图片

 

优化二的方法理论上计算出来的余数应该是与模二除法原始计算方法是一致的,但实际上我们带入CRC16 CCITT False标准算法发现与之不同。这是为什么呢?

上述的优化方法是基于crc寄存器初始是0的计算值与原来的一致,而某些算法的初始值不一定为0,这就导致了CRC算法计算的值与模二除法的有了差异。

为什么会有初值不为0的计算呢?

我们模二除法计算是可以发现,头部一个0与多个0计算的结果都是相同的,因此在传输过程中,如果前面添加了0或者少了0,是无法检测到的,因此将CRC初值预设成其他值来避免这个问题,CRC16 CCITT False初值为0xFFFF,因此计算出来的CRC值是不同的。

 

 

上一篇 【CRC】CRC推导(三)字节查表与半字节查表    下一篇 【CRC】CRC推导(五)CRC8的各种实现

你可能感兴趣的:(算法)