[ CRC32 计算方法 -- 直接计算法 ]
----这里不做什么技术性探讨为什么CRC32可以效应以及CRC32的原理。那不是我所关心的,我所关心的只是能否正确地使用它。CRC32 在网上有众多的POLY(也就是可以看成为种子一样的值)。WinRar 使用的是 0xedb88320。还有ISO标准的其他poly 值。这个值可以通过GOOGLE搜到很多。查表法很优秀,但要用掉无关痛痒的1KB空间。如果想节省1KB空间,就只有直接计算了。
这里为整理后的直接计算Crc32的代码段:
typedef unsigned int SZ_UINT;
typedef unsigned char SZ_UCHAR;
SZ_UINT GetCrc32Indirect( SZ_UCHAR * DataPtr, int DataLen, int CrcPoly ){
int dataIdx;
SZ_UINT crc32, byteTmp;
int bitLoop;
crc32 = 0xffffffff;
for( dataIdx = 0; dataIdx < DataLen; dataIdx ++){
byteTmp = ( SZ_UINT )( DataPtr[ dataIdx ] ) & 0x000000ff;
for( bitLoop = 0; bitLoop < 8; bitLoop++ ){
if((( crc32 ^ byteTmp ) & 1 ) != 0 )
crc32 = (( crc32 >> 1 ) & 0x7fffffff ) ^ CrcPoly;
else
crc32 = (( crc32 >> 1 ) & 0x7fffffff );
byteTmp = ( byteTmp >> 1 ) & 0x7fffffff;
}
}
return crc32 ^ 0xffffffff;
}
代码短,没什么解释的。使用Poly = 0xedb88320 计算字串"ABCEE"所得CRC32 = 0x6bc82b94, 与WinRAR 计算只有"ABCEE"5个字符的文本文件的CRC32相同.