CRC循环冗余校验【实现篇】
在之前的文章当中,我简单介绍了一下有关于CRC的原理,这次呢,我们从开发的角度来看一下CRC的具体实现,因为CRC的种类实在是太多了,如果咱们一个一个实现,那就太费劲了,所以直接来看通用的实现方法。
参数
对于如何确定一个CRC校验,可以通过如下的参数来确定,
「多项式(Poly)」: 它是一个二进制数,表示用于生成CRC码的多项式,多项式长度取决于数据位的位数。
**初始值(Initial Value)**: 一个二进制数,表示在计算CRC码之前,应该在数据字节流的开头添加的字节,通常情况是全0或者全1。
**终止值(Final Xor Value)**:一个二进制数,表示在计算CRC码之后,应该对CRC码进行执行异或操作的字节,通常情况是全0或者全1。
**反转输入(Reflect Input)**:对输入的字节是否进行反转。
「反转输出(Reflect Input)」: 对输出的字节是否进行反转。
有关于第一个参数的含义,可以参考下我之前写过的文章,https://mp.weixin.qq.com/s/VwT__b-1cjaLcK0o7D-Vjw。
代码实现
再次相应读者们的选择,这次还是用C++来写,比较容易写出来一个比较通用的代码,当然我这代码就仅仅支持到crc64的任意多项式,再多其实也有,目前就先不支持了,实际上用的也不多。
我们具体使用一个例子来看一下这个代码,首先我们选取这个来作为例子来看一下,至于为啥选他,看着他简单而已,那下面我们先根据上面我们选取的参数,来看一下。
「多项式(Poly)」: 0x07
**初始值(Initial Value)**: 0x00
**终止值(Final Xor Value)**:0x00
**反转输入(Reflect Input)**:false
「反转输出(Reflect Input)」: false
假设我们的输入是,为啥不选,因为1是一个常量,乘了和没乘是一样的,所以我们换一个数字。
对应输入的多项式为
,对应生成多项式为
,然后我们可以得到`r=8`,然后计算下
,我们可以得到:
也就是最终得到的校验值,然后我们运行下我们写的程序看一下。
发现输出结果和我们写的程序是一样的,至于这个值,我这是怎么算出来的,读者可以自己尝试一下手动计算,我这里当然是选择科技与狠活了,如果大家对于这个我怎么算的感兴趣,我可以单独写一篇有关怎么计算多项式的文章,咳咳,不要吐槽我水文章哈。
好了,到这里有关于通用版本的CRC计算方案,到这里就给大家讲完了,然后呢,这里我找了下有关于CRC计算的常见多项式,和一些参数,以下资料来自互联网。
常见CRC方案
里面内容来自于参考资料2,我只是个搬运工。
参考资料
https://zlib.net/crc_v3.txt
https://reveng.sourceforge.io/crc-catalogue/
https://crccalc.com/
领取专属 10元无门槛券
私享最新 技术干货