00001
00002
00003
00004
00005 #include "Crc32.h"
00006 #include <fstream.h>
00007
00008 DWORD CCrc32Static::s_arrdwCrc32Table[256] =
00009 {
00010 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
00011 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
00012 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
00013 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
00014 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
00015 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
00016 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
00017 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
00018 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
00019 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
00020 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
00021 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
00022 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
00023 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
00024 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
00025 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
00026
00027 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
00028 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
00029 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
00030 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
00031 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
00032 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
00033 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
00034 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
00035 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
00036 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
00037 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
00038 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
00039 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
00040 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
00041 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
00042 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
00043
00044 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
00045 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
00046 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
00047 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
00048 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
00049 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
00050 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
00051 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
00052 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
00053 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
00054 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
00055 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
00056 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
00057 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
00058 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
00059 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
00060
00061 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
00062 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
00063 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
00064 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
00065 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
00066 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
00067 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
00068 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
00069 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
00070 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
00071 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
00072 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
00073 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
00074 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
00075 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
00076 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,
00077 };
00078
00079 CCrc32Static::CCrc32Static()
00080 {
00081 }
00082
00083 CCrc32Static::~CCrc32Static()
00084 {
00085 }
00086
00087 inline void CCrc32Static::CalcCrc32(const BYTE byte, DWORD &dwCrc32)
00088 {
00089 dwCrc32 = ((dwCrc32) >> 8) ^ s_arrdwCrc32Table[(byte) ^ ((dwCrc32) & 0x000000FF)];
00090 }
00091
00092 bool CCrc32Static::GetFileSizeQW(const HANDLE hFile, QWORD &qwSize)
00093 {
00094 bool bSuccess = true;
00095
00096 try
00097 {
00098 DWORD dwLo = 0, dwHi = 0;
00099 dwLo = GetFileSize(hFile, &dwHi);
00100
00101 if(dwLo == INVALID_FILE_SIZE && GetLastError() != NO_ERROR)
00102 {
00103 bSuccess = false;
00104 qwSize = 0;
00105 }
00106 else
00107 {
00108 qwSize = MAKEQWORD(dwHi, dwLo);
00109 }
00110 }
00111 catch(...)
00112 {
00113 bSuccess = false;
00114 }
00115
00116 return bSuccess;
00117 }
00118
00119 DWORD CCrc32Static::StringCrc32(LPCTSTR szString, DWORD &dwCrc32)
00120 {
00121 DWORD dwErrorCode = NO_ERROR;
00122
00123 dwCrc32 = 0xFFFFFFFF;
00124
00125 try
00126 {
00127 while(*szString != 0)
00128 {
00129 CalcCrc32((BYTE)*szString, dwCrc32);
00130 szString++;
00131 }
00132 }
00133 catch(...)
00134 {
00135
00136 dwErrorCode = ERROR_CRC;
00137 }
00138
00139 dwCrc32 = ~dwCrc32;
00140
00141 return dwErrorCode;
00142 }
00143
00144 DWORD CCrc32Static::FileCrc32Streams(LPCTSTR szFilename, DWORD &dwCrc32)
00145 {
00146 #if UNICODE || _UNICODE
00147 return ERROR_NOT_SUPPORTED;
00148 #else
00149
00150 DWORD dwErrorCode = NO_ERROR;
00151 ifstream file;
00152
00153 dwCrc32 = 0xFFFFFFFF;
00154
00155 try
00156 {
00157
00158 file.open(szFilename, ios::in | ios::nocreate | ios::binary, filebuf::sh_read);
00159
00160 if(file.is_open())
00161 {
00162 char buffer[MAX_BUFFER_SIZE];
00163 int nLoop, nCount;
00164 nCount = file.read(buffer, sizeof(buffer)).gcount();
00165 while(nCount)
00166 {
00167 for(nLoop = 0; nLoop < nCount; nLoop++)
00168 CalcCrc32(buffer[nLoop], dwCrc32);
00169 nCount = file.read(buffer, sizeof(buffer)).gcount();
00170 }
00171
00172 file.close();
00173 }
00174 }
00175 catch(...)
00176 {
00177
00178 dwErrorCode = ERROR_CRC;
00179 }
00180
00181 if(file.is_open()) file.close();
00182
00183 dwCrc32 = ~dwCrc32;
00184
00185 return dwErrorCode;
00186 #endif
00187 }