|
网上有很多理论介绍和代码,现整理了一下,经过测试可以使用,代码如下
/*******************************************************************/
/*
函 数 名 称: CRC32
功 能 描 述: 执行对数据段的CRC32循环冗余校验
参 数 说 明: buffer[in]:待校验数据
size[in]:待校验数据长度
返回值 说明: 循环冗余校验结果
/*******************************************************************/
unsigned long CRC32(unsigned char *buffer, unsigned long size)
{
unsigned long ulPolynomial = 0x04C11DB7;
int i, j;
unsigned long m_Table[256];
unsigned long Result=0;
for (i = 0; i <= 0xFF; i++)
{
m_Table[i] = CRC32_Reflect(i, 8) << 24;
for (j = 0; j < 8; j++)
m_Table[i] = (m_Table[i] << 1) ^ (m_Table[i] & (1 << 31) ? ulPolynomial : 0);
m_Table[i] = CRC32_Reflect(m_Table[i], 32);
}
Result = 0xFFFFFFFF;
while (size--)
{Result = (Result >> 8) ^ m_Table[(Result & 0xFF) ^ *buffer++];}
Result ^= 0xFFFFFFFF;
return Result;
}
unsigned long CRC32_Reflect(unsigned long ref, char ch)
{
unsigned long value = 0;
int i;
// Swap bit 0 for bit 7, bit 1 for bit 6, etc.
for(i = 1; i < (ch + 1); i++)
{
if (ref & 1)
value |= 1 << (ch - i);
ref >>= 1;
}
return value;
} |
评分
-
查看全部评分
|