请教查表法计算CRC的原理
在学CRC算法原理,受挫啊,这么一个简单的算法竟然看不懂
下面引用一下vipchenji 《CRC技术的实现与破解》的原文
-----------------------------------------------------------------------------------------------------
下面就给您介绍CRC检验码的计算过程(查表法)
(1)将上次计算出的CRC校验码右移一个字节;
(2)将移出的这个字节与新的要校验的字节进行XOR 运算;
(3)用运算出的值在预先生成码表中进行索引,获取对应的值(称为余式);
(4)用获取的值与第(1)步右移后的值进行XOR 运算;
(5)如果要校验的数据已经处理完,则第(4)步的结果就是最终的CRC校验码。如果还有数据 要进行处理,则再转到第(1)步运行。
CRC32=CRC_32_Tbl[(CRC32^((unsigned__int8*)p)[i])&0xff]^(CRC32>>8);
怎么样?简单吧。
下面是完整的一个实现函数,更加简单:
//--------------------------------------------
//CalcCRC32函数计算出给定数据串的CRC-32校验码
//Code : Chenji
//--------------------------------------------
unsigned int CalcCRC32(void *DataBuff,unsigned int BufLen)
{//DataBuff是指向数据串的指针,BufLen是数据串的长度
unsigned int CRC32=0xffffffff; //设置初始值
for(unsigned long i=0; i<BufLen; ++i)
CRC32 = CRC_32_Tbl[(CRC32^((unsigned __int8 *)DataBuff)[i]) & 0xff] ^ (CRC32>>8);
//如果你的编译器不支持unsigned __int8定义,请试用unsigned char
return CRC32;
}
-------------------------------------------------------------------------------------------
请知道的或看懂的各位给我详细讲解一下查表法计算CRC的这个过程是怎么来的,实在是资质欠佳,看了很多天没头绪,也参考了部分资料(附件里),还是不懂
,谢谢!
