概述
如果您不想将一大堆码表复制到您的代码中,可以使用动态生成码表(不过是给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校验码(代码)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复