///////////////////////////////////////////////////////////////////////// // $Id: crc32.cc,v 1.5 2008-04-17 14:39:32 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // /* CRC-32 calculator * Adapted from http://www.createwindow.org/programming/crc32/ */ #include "crc32.h" CRC_Generator::CRC_Generator() { init(); } void CRC_Generator::init(void) { Bit32u POLYNOMIAL = 0x04c11db7; int i; for(i = 0; i<0xFF; i++) { int j; crc32_table[i]=reflect(i,8) << 24; for(j=0; j<8; j++) crc32_table[i] = (crc32_table[i]<<1)^(crc32_table[i] & (1<<31) ? POLYNOMIAL : 0); crc32_table[i] = reflect(crc32_table[i], 32); } } Bit32u CRC_Generator::reflect(Bit32u ref, Bit8u ch) { Bit32u value(0); int i; for(i=1; i<(ch+1); i++) { if(ref & 1) value |= 1 << (ch-i); ref >>= 1; } return value; } Bit32u CRC_Generator::get_CRC(Bit8u * buf, Bit32u buflen) { Bit32u ulCRC(0xFFFFFFFF); Bit32u len(buflen); Bit8u * buffer=(Bit8u *) buf; while(len--) ulCRC=(ulCRC>>8)^crc32_table[(ulCRC & 0xFF)^*buffer++]; return ulCRC ^ 0xFFFFFFFF; }