CRC总结

来源:互联网 发布:薛之谦淘宝下线 编辑:程序博客网 时间:2024/05/02 04:54
 

花了一周多的时间把CRC16实现了。对CRC有了一定的了解。现在总结一下,把大的结构和框架总结一下,方便以后使用。

由于不会,因此在网上查找了许多资料,到现在回头看看,比较系统的资料为:“我学习CRC32、CRC16、CRC原理和算法的总结.pdf”这份资料。比较系统详细全面。建议大家看这份资料。我的总结主要是一些主要内容和结构。初次接触CRC最好还是以推荐资料为主。

可以在下面这个网址下载。

http://wenku.baidu.com/view/fb791c0203d8ce2f006623f5.html

目前实现CRC的算法主要有四种,他们之间的关系是从最简单逐级优化而形成的。因此也是进化和思考的结果。

第一种是最简单的,就是简单的“直接计算法”。其原理是根据CRC的最基础原理“与或”操作实现功能。
具体算法如下:
    把register中的值置0
    把原始的数据后添加W个0
    while(还有剩余没有处理的数据)
        Begin
        把register中的值左移一位,读入一个新的数据并置于register最低位的位置。
        if(如果上一步的左移操作中的移出的一位是1)
  register=register XOR Poly.
        end if

第二种方法是“驱动表法” Table-Driven Implementation
他的实现原理是XOR的交换律。
具体算法如下:
    register左移一个字节,从原始数据中读入一个新的字节
    利用刚从register移出的字节作为下标定位table中的一个32位的值
    把这个值XOR到register中。
    如果还有未处理的数据则回到第一步继续执行。


第三种算法是“直驱表法”  Direct table algorithm
还是用到了XOR的交换律,就是在“驱动表法”的基础上进行算法的优化。
主要思想是:数据可以先与刚从寄存器移出的字节相XOR,用得到的结果值进行查表,再用表值XOR寄存器。
具体算法是:
    寄存器左移一个字节
    将刚从register移出的字节与新的信息字节相XOR,结果值作为定位索引,从查询表中取得相应的表值。
    把表值XOR到register中。
    如果还有未处理的数据则回到第一步继续执行。


第四种算法是“颠倒的直驱表法” “Reflected” table-driven implementations
他的形成原因是:在数据通信中,一些发送数据是从低字节开始发送,因此需要用“颠倒”算法。
算法如下:
    寄存器向右移动一个字节
    将刚移出的字节与待测数据中的新字节做XOR运算,得到一个指向查询表的索引值。
    将索引所指的表值与寄存器做XOR运算。
    如果数据没有全部处理完,则跳到步骤一。


四种算法介绍完之后,还需要了解 CRC参数模型。
因为实际情况有一些变化,不同的情况用了不同参数的组合。
CRC参数模型如下:
Name: CRC-32
Width:32     //CRC比特数
Poly:04c11db7  //CRC生成项
init:FFFFFFFF //寄存器初始值,有些是0X00000000
RefIn:True //RefIn为True则每个字节要颠倒
RefOut:True //RefOut为True,寄存器中的值要先“颠倒”,再进入XOROUT处理
XorOut:FFFFFFFF  //W位长的16进制数值
Check:CBF43926  //这是字符串“123456789”,用这个CRC参数模型计算后得到的CRC值,作为参考。

所以基于这些参数的不同,因此我们算出的结果都有很多不同,所以需要根据字节实际情况仔细辨别。

大家可以用这个软件测试自己的CRC数据。因为可选择的CRC类型很多。

这个软件的名字是:CRC_Calc v0.2.exe。

可以在CSDN上下载