快捷搜索: 王者荣耀 脱发

关于CRC校验的一些总结

1、CRC校验的原理

模二除法,除数根据多项式不同有很多种,CRC8,CRC16,CRC32,即使同样的CRC8还有几种不同的除数。

上述模二除法说到底就是一种异或操作,如何操作,请参考他人的视频:

[CRC校验]手算与直观演示

[CRC校验]手算与直观演示

该视频就是用异或的方式实现模二除法。

知道了原理,如何编程呢,如果按照视频里的描述,如果我有一个10个字节长度的数据,与8位除数进行crc校验,岂不是要将所有数据串起来成为一个特别长的数据 unsigned int80, 不是的。

2、原理了解了,再来看如何编程,

简而言之,先计算第一个字节的crc结果,然后把第一个字节的crc结果与第二个字节进行异或, 异或后的值再进行一次crc计算就可以了,多个字节也是反复这过程就好。

3、计算量来讲,每个字节数据要进行8次移位或者移位+异或(CRC8, CRC16,CRC32都是如此),之后前一个字节的crc结果再与后一个字节数据再进行异或,数据计算量不小。因此,可以采用查表法,查表法可以将每个字节与除数的crc计算通过一次查表完成,可以节省大量计算。对于CRC8表的大小是256byte,CRC16是512byte,不是256*256个byte,个人推断CRC32应该需要256*4个byte就够了。

4、CRC出错的概率

必须说明的是CRC不能百分百保证通过校验的数据都是可靠的,有一定的出错的概率。一般情况下,可以认为出错概率CRC8>CRC16>CRC32,可见容易计算的,往往可靠性也是最低的。

如果不是特别在乎出错的概率,我认为累加和校验则是一种性价比很高的校验方式,计算简单,纠错能力不比crc8校验差太多。

经验分享 程序员 微信小程序 职场和发展