Crc32Dynamic.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "stdafx.h"
  2. #include "Crc32Dynamic.h"
  3. //#include <fstream.h>
  4. CCrc32Dynamic::CCrc32Dynamic() : m_pdwCrc32Table(NULL)
  5. {
  6. Init();
  7. }
  8. CCrc32Dynamic::~CCrc32Dynamic()
  9. {
  10. Free();
  11. }
  12. void CCrc32Dynamic::Init()
  13. {
  14. // This is the official polynomial used by CRC32 in PKZip.
  15. // Often times the polynomial shown reversed as 0x04C11DB7.
  16. DWORD dwPolynomial = 0xEDB88320;
  17. int i, j;
  18. Free();
  19. m_pdwCrc32Table = new DWORD[256];
  20. DWORD dwCrc;
  21. for(i = 0; i < 256; i++)
  22. {
  23. dwCrc = i;
  24. for(j = 8; j > 0; j--)
  25. {
  26. if(dwCrc & 1)
  27. dwCrc = (dwCrc >> 1) ^ dwPolynomial;
  28. else
  29. dwCrc >>= 1;
  30. }
  31. m_pdwCrc32Table[i] = dwCrc;
  32. }
  33. }
  34. void CCrc32Dynamic::Free()
  35. {
  36. delete m_pdwCrc32Table;
  37. m_pdwCrc32Table = NULL;
  38. }
  39. inline void CCrc32Dynamic::CalcCrc32(const BYTE byte, DWORD &dwCrc32) const
  40. {
  41. dwCrc32 = ((dwCrc32) >> 8) ^ m_pdwCrc32Table[(byte) ^ ((dwCrc32) & 0x000000FF)];
  42. }
  43. DWORD CCrc32Dynamic::GenerateCrc32(const LPBYTE lpbArray, DWORD dSize, DWORD &dwCrc32)
  44. {
  45. DWORD dwErrorCode = NO_ERROR;
  46. // dwCrc32 = 0xFFFFFFFF;
  47. try
  48. {
  49. // Is the table initialized?
  50. if(m_pdwCrc32Table == NULL)
  51. throw 0;
  52. for(DWORD i = 0; i < dSize; i++)
  53. {
  54. CalcCrc32(lpbArray[i], dwCrc32);
  55. }
  56. }
  57. catch(...)
  58. {
  59. // An unknown exception happened, or the table isn't initialized
  60. dwErrorCode = ERROR_CRC;
  61. }
  62. // dwCrc32 = ~dwCrc32;
  63. return dwErrorCode;
  64. }