CRC(Cyclic Redundancy Check)校验又叫循环冗余校验,主要是利用除法及余数的原理进行数据错误检测。将接收到的数据码组进行除法运算,如果除尽,则说明数据传输正确,如果未除尽,则说明数据传输错误,同时CRC校验还具有自动纠错能力。
按照惯例,使用 CRC-32 多项式以及 CRC-16-CCITT 多项式时通常都要取反。CRC-32 的核验多项式是
C(x) = x31 + x30 + x26 + x25 + x24 + x18 + x15 + x14 + x12 + x11 + x10 + x8 + x6 + x5 + x4 + x3 + x + 1。即
创建的CRC32表:
CreateTable()
{
unsigned long crc;
for(int i=0;i<256;i++)
{
crc = i;
for(int j=0;j<8;j++)
{
if(crc & 1)
crc = (crc >> 1) ^ 0xEDB88320;
else
crc >>= 1;
}
CRC32Table[i] = crc;
}
}
获取文件CRC32码
GetCRC(CString &csData, DWORD dwSize)
{
unsigned long crc(0xffffffff);
int len;
unsigned char* buffer;
len = dwSize;
buffer = (unsigned char*)(LPCTSTR)csData;
while(len--)
crc = (crc >> 8) ^ CRC32Table[(crc & 0xFF) ^ *buffer++];
return crc^0xffffffff;
}