首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CRC循环冗余校验【实现篇】

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/

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230324A08UJB00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券