| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- #include "stdafx.h"
- #include "Crc32Dynamic.h"
- //#include <fstream.h>
- CCrc32Dynamic::CCrc32Dynamic() : m_pdwCrc32Table(NULL)
- {
- Init();
- }
- CCrc32Dynamic::~CCrc32Dynamic()
- {
- Free();
- }
- void CCrc32Dynamic::Init()
- {
- // This is the official polynomial used by CRC32 in PKZip.
- // Often times the polynomial shown reversed as 0x04C11DB7.
- DWORD dwPolynomial = 0xEDB88320;
- int i, j;
- Free();
- m_pdwCrc32Table = new DWORD[256];
- DWORD dwCrc;
- for(i = 0; i < 256; i++)
- {
- dwCrc = i;
- for(j = 8; j > 0; j--)
- {
- if(dwCrc & 1)
- dwCrc = (dwCrc >> 1) ^ dwPolynomial;
- else
- dwCrc >>= 1;
- }
- m_pdwCrc32Table[i] = dwCrc;
- }
- }
- void CCrc32Dynamic::Free()
- {
- delete m_pdwCrc32Table;
- m_pdwCrc32Table = NULL;
- }
- inline void CCrc32Dynamic::CalcCrc32(const BYTE byte, DWORD &dwCrc32) const
- {
- dwCrc32 = ((dwCrc32) >> 8) ^ m_pdwCrc32Table[(byte) ^ ((dwCrc32) & 0x000000FF)];
- }
- DWORD CCrc32Dynamic::GenerateCrc32(const LPBYTE lpbArray, DWORD dSize, DWORD &dwCrc32)
- {
- DWORD dwErrorCode = NO_ERROR;
- // dwCrc32 = 0xFFFFFFFF;
- try
- {
- // Is the table initialized?
- if(m_pdwCrc32Table == NULL)
- throw 0;
- for(DWORD i = 0; i < dSize; i++)
- {
- CalcCrc32(lpbArray[i], dwCrc32);
- }
- }
- catch(...)
- {
- // An unknown exception happened, or the table isn't initialized
- dwErrorCode = ERROR_CRC;
- }
- // dwCrc32 = ~dwCrc32;
- return dwErrorCode;
- }
|