之前写过一篇文章《如何计算IP或ICMP协议首部里的checksum字段》,采用的方法是:感兴趣的可以点击下面的链接,所采用的方法是:反码求和法,核心思想是先求和,再取反,今天学习一种更复杂的算法CRC-8、CRC-16或CRC-32算法
我们知道,反码求和法用的是加法
而CRC算法,用的是“除法”,这里的“除法”指的不是我们平时生活中所说的十进制除法,而是二进制中的异或取余
我们以CRC8的算法为例
既然是“除法”,肯定要有除数和被除数
被除数指的是需要被CRC校验的数据,除数根据CRC算法的不同,除数也不同,在CRC校验中,把除数称之为生成多项式
比如
CRC-8的多项式公式为:x8 + x2 + x + 1,
表示:1 0000 0111
值为0x107
CRC-8/MAXIM的多项式公式为:x8 + x5 + x4 + 1
表示:1 0011 0001
值为0x131
CRC-16/CCITT的多项式公式为:x16 + x12 + x5 + 1
表示:1 00010000 00100001
值为0x11021
可以看出
- x8表示bit8为1,x5表示bit5为1,1表示bit0为1,其他位则为0
- CRC-8的多项式共9个bit,CRC-16的多项式共17个bit,多项式总比CRC校验值多一个bit位