CRC32 直接计算方法

 [ 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相同.

 

 

你可能感兴趣的:(我的数据计算相关)