69,369
社区成员
发帖
与我相关
我的任务
分享
void CreateCrc32Table()
{
int i,j;
unsigned long crc;
for(i = 0; i < 256; ++i)
{
crc = i;
for(j = 8; j != 0; j--)
{
if (crc & 0x1)// 判断crc最后一位是否为1
{
crc >>= 1;// crc右移1位,相当于crc除以2
crc ^= 0xedb88320;// crc再与0xedb88320异或,相当于 crc = crc ^ 0xedb88320;
}
else
{
crc >>= 1;// 同上
}
}
m_szCrc32Table[i] = crc;// 保存
}
}//end of CreateCrc32Table()
unsigned long Calc(const unsigned char *lpBytes, int length)
{
unsigned long crc = 0xffffffff;
for(;length--;)// 如果length不为0,一直循环
{
crc = (crc >> 8) ^ m_szCrc32Table[(crc & 0xFF) ^ *lpBytes++] ;// &表示与运算,即 1&0 == 0 , 1&1 == 1
}
return (~crc);// 取反,即,~1 == 0 , ~0 == 1
}//end of Calc()
调用方法:
unsigned long crc32;
crc32 = Calc(待计算内容首地址,内容长度);