我是靠谱客的博主 饱满小丸子,最近开发中收集的这篇文章主要介绍查表法计算CRC校验码(代码),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

如果您不想将一大堆码表复制到您的代码中,可以使用动态生成码表(不过是给256个数字进行CRC计算而已)。下面是生成CRC-32码表的代码(C/C++语言):

/***************************************************************************
* Description: GenCrc32Tbl函数动态生成CRC-32的预置码表
* Arguments  :
* Returns    :
***************************************************************************/
DWORD CRC32_Tbl[256];       //用来保存CRC32码表

void GenCrc32Tbl()
{
    DWORD CRC;
    for(int i=0; i<256; i++){//用++i以提高效率
        CRC=i;
        //这个循环实际上就是用"计算法"来求取CRC的校验码
        for(int j=0; j<8; j++){  
            if(CRC&1)
                CRC=(CRC>>1)^0xEDB88320;    //0xEDB88320就是CRC-32多项表达式的值
            else
                CRC>>=1;
        }
        CRC32_Tbl[i]=CRC;
    }
}

●上面的代码其实就已经实现了用“计算法”求取CRC校验码的过程,只要做些修改就可以完全实现。您只要将上面的代码复制到程序中,并调用GenCrc32Tbl函数,就可以在

CRC_32_Tbl中生成CRC-32的预置码表。有了码表,用“查表法”计算CRC-32计算校验码就易如反掌了。根据上面介绍的算法,用C语言只需要一行就可以实现。
        CRC32 = CRC32_Tbl[ (CRC32^((BYTE*)DataBuff)[i]) & 0xff ] ^ (CRC32>>8); 怎么样?简单吧。

下面是完整的一个实现函数,更加简单:

/***************************************************************************
* Description: CalcCRC32函数计算出给定数据串的CRC-32校验码
* Arguments  : DataBuff     指向数据串的指针
*              BufLen       数据串的长度
* Returns    : 给定数据串的CRC-32校验码
***************************************************************************/
DWORD CalcCRC32(void *DataBuff,DWORD BufLen)
{  
    DWORD CRC32 = 0; //设置初始值
   
    for(DWORD i=0; i<BufLen; ++i)
        CRC32 = CRC32_Tbl[ (CRC32^((BYTE*)DataBuff)[i]) & 0xff ] ^ (CRC32>>8);

    return CRC32;
}

最后

以上就是饱满小丸子为你收集整理的查表法计算CRC校验码(代码)的全部内容,希望文章能够帮你解决查表法计算CRC校验码(代码)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部