查表法计算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;
}

你可能感兴趣的:(c,算法,语言,byte)