这几天一直在看CRC校验算法。CRC版本众多,网站上实现算法一大坨,可一开始根本搞不清楚那个是哪个。连续上百度,哔哩哔哩,知乎看了很多解读CRC算法的,终于有了一些眉目,打算写下来,方便日后参考。
CRC算法核心其实只有一种,即二进制除法的实现,版本众多的原因主要有以下几个原因:
CRC字段的长度
多项式公式
初始值
输出是否水平翻转
输入是否水平翻转
结果异或值
我绝大多数的文章都只谈到了CRC字段的长度和多项式公式,没有涉及剩余的三项在crc算法中的应用。
CRC字段的长度,字段越长,对于crc算法的校验能力越强。如果我们用出错的概率来评估校验能力的话。N长度的字段,他的校验能力为1/2**N。此处的运算符号采用Python语言中的含义。
一般而言,我们取的长度主要有8位,16位和32位。当然也有一些比较奇特的,4位,5位和6位,还有7位。
多项式公式是我们二进制多项式算法中的除数。不同的算法往往取的多项式是不一样的。
初始值,是指CRC字段的初始值。常常是从0和全是1中选择。
输入反转。具体的操作方法实施将输入的数据按照字节为单位进行水平反转。比如01000001,翻转结果是10000010。
输出翻转。输出翻转的操作与输入翻转操作是一样的。只是输出翻转是将整个CRC字段进行水平翻转。
结果异或值,是用来和通过上述的算法算出来的结果进行异或的一个数据值。如果这个值是0的话,那么就相当于没有进行异或。
为什么需要这么多看起来乱七八糟的种类呢。这些算法分别针对不同的数据的检验。针对不同的数据的特性,比如说某些数据,一开始就会有大量的零,如果不采用输入翻转或者初始值的话,那么这些0就对于校验结果没有任何影响。这就如我们想要的结果有出入了,我们希望校验结果和数据是一一对应的,并且是唯一的。如果不唯一那么,校验结果也就失去了意义。因此这么多算法的出现,主要原因就是为了适应不同的数据字符串的特点。
下面就是一些例子了。
验证网站:http://www.ip33.com/crc.html
算法参数意义 CRC-16/IBM 算法参数
网友评论