/arch/x86/iodev/crc32.cc

https://github.com/antmar/Skyeye-fixes · C++ · 52 lines · 36 code · 9 blank · 7 comment · 5 complexity · 8ba900a48a449469678c1d415053100f MD5 · raw file

  1. /////////////////////////////////////////////////////////////////////////
  2. // $Id: crc32.cc,v 1.5 2008/04/17 14:39:32 sshwarts Exp $
  3. /////////////////////////////////////////////////////////////////////////
  4. //
  5. /* CRC-32 calculator
  6. * Adapted from http://www.createwindow.org/programming/crc32/
  7. */
  8. #include "crc32.h"
  9. CRC_Generator::CRC_Generator() {
  10. init();
  11. }
  12. void CRC_Generator::init(void)
  13. {
  14. Bit32u POLYNOMIAL = 0x04c11db7;
  15. int i;
  16. for(i = 0; i<0xFF; i++) {
  17. int j;
  18. crc32_table[i]=reflect(i,8) << 24;
  19. for(j=0; j<8; j++)
  20. crc32_table[i] = (crc32_table[i]<<1)^(crc32_table[i] & (1<<31) ? POLYNOMIAL : 0);
  21. crc32_table[i] = reflect(crc32_table[i], 32);
  22. }
  23. }
  24. Bit32u CRC_Generator::reflect(Bit32u ref, Bit8u ch)
  25. {
  26. Bit32u value(0);
  27. int i;
  28. for(i=1; i<(ch+1); i++) {
  29. if(ref & 1)
  30. value |= 1 << (ch-i);
  31. ref >>= 1;
  32. }
  33. return value;
  34. }
  35. Bit32u CRC_Generator::get_CRC(Bit8u * buf, Bit32u buflen)
  36. {
  37. Bit32u ulCRC(0xFFFFFFFF);
  38. Bit32u len(buflen);
  39. Bit8u * buffer=(Bit8u *) buf;
  40. while(len--)
  41. ulCRC=(ulCRC>>8)^crc32_table[(ulCRC & 0xFF)^*buffer++];
  42. return ulCRC ^ 0xFFFFFFFF;
  43. }