广告中的创意提要指的是什么?如何写广告编写呢?先谢...

百度上介绍CRC计算原理和方法的文章一大推,也许是我太愚笨,花了几个小时的时间也没有完全看明白。最终经过我不断的尝试和研究,终于把整个计算过程搞清楚了。做个记录总结一下。。。

下面直奔主题,网上找了两个计算CRC的软件,输入同样的数据,选择同样的算法,得到的结果一样,

这两个软件的对应关系如下:

Name:就是算法的名称,比如对于16bit的CRC来说就有好多个名字,也就是虽然都是16 bit CRC,但是计算方式也有好多种

Poly:是多项式的值,以上面图中的CRC-8:x8+x2+x+1为例,它表示二进制为100000111,

去掉最高位的1,十六进制表示就是0x07

Init: Init 的位数和Poly的位数相同,它的值为全0或者全F,当全为0时,在算法开始前对数据(这个数据是根据RefIn的值得到的)后面补上CRC位数个0后就可以进行后续计算了。当全为1时,表示在算法开始前对数据的前CRC位数(高位)先和对应位数个1进行异或(即:前CRC位数的值按位取反),再在后面补上CRC位数个0,才进行后续计算。

RefIn为False表示,输入的原始数据的每个字节的第7位作为最高有效位,第0为作为最低有效位,即正常计算即可

当RefIn为True时,输入的原始数据的每个字节需要做个逆序的处理,注意:针对的每个字节,而不是整个数据,以一个4字节的原始数据为例:

当Refout为False时,输出不做处理,当Refout为True,需要对输出数据做一次整个数据的逆序处理,注意:这里做的逆序和RefIn不同,它不是按字节逆序,而是整个逆序,以CRC-32为例来说明,最后的数据为32位,当Refout为True时,翻转如下:

XorOut:表示根据上面参数计算完后,和这个数再进行一次异或。

下面分析一下上面的结果0x79的由来:

说明:上述的计算没有使用通常除法运算中用到的减法,这里用异或代替了减法

8)由于Xorout为0,表示不用再取反,所以最终的结果就是,即十六进制0x79

算一个不过瘾,我们再来计算一个 

这一次和上面唯一的不同是将初始值由原来的0x00换为了0xFF,没错这个例子就是给大家演示初始值到底什么意思.

下面分析一下上面的结果0x79的由来:

8)由于Xorout为0,表示不用再取反,所以最终的结果就是,即十六进制0x8A

这个例子演示了初始值的含义,我们再看最后一个例子,这个例子演示了RefIn和RefOut为True的具体含义

3) 因为Init为0x00,所以2)的到后面直接添加4个0即可,得到

最后得到余数:0010

8)由于Xorout为0,表示不用再取反,所以最终的结果就是0100

  相信大家把上述那个计算过程弄明白,CRC的计算原理也就清楚了。至于软件代码上如何具体实现,以后再探讨。对于Kinetis MCU来说,很多MCU本身集成了硬件CRC模块,你只需要配置配置寄存器,就可以算出CRC结果了。但是不管对于软件实现还是硬件实现,理论基础永远是第一位的。

附件用到的CRC计算软件:

本网站会使用Cookies以提升您的访问体验。如继续浏览本网站,则表示您同意我们使用Cookies。更多Cookies政策请见本网站的

参考资料

 

随机推荐