CRC计算代码

/************************************************************************/
/* Calculate CRC value of file                                          */
/************************************************************************/
unsigned 
long Crc32Table[256= {
    
0x00000000L0x77073096L0xee0e612cL0x990951baL0x076dc419L,
        
0x706af48fL0xe963a535L0x9e6495a3L0x0edb8832L0x79dcb8a4L,
        
0xe0d5e91eL0x97d2d988L0x09b64c2bL0x7eb17cbdL0xe7b82d07L,
        
0x90bf1d91L0x1db71064L0x6ab020f2L0xf3b97148L0x84be41deL,
        
0x1adad47dL0x6ddde4ebL0xf4d4b551L0x83d385c7L0x136c9856L,
        
0x646ba8c0L0xfd62f97aL0x8a65c9ecL0x14015c4fL0x63066cd9L,
        
0xfa0f3d63L0x8d080df5L0x3b6e20c8L0x4c69105eL0xd56041e4L,
        
0xa2677172L0x3c03e4d1L0x4b04d447L0xd20d85fdL0xa50ab56bL,
        
0x35b5a8faL0x42b2986cL0xdbbbc9d6L0xacbcf940L0x32d86ce3L,
        
0x45df5c75L0xdcd60dcfL0xabd13d59L0x26d930acL0x51de003aL,
        
0xc8d75180L0xbfd06116L0x21b4f4b5L0x56b3c423L0xcfba9599L,
        
0xb8bda50fL0x2802b89eL0x5f058808L0xc60cd9b2L0xb10be924L,
        
0x2f6f7c87L0x58684c11L0xc1611dabL0xb6662d3dL0x76dc4190L,
        
0x01db7106L0x98d220bcL0xefd5102aL0x71b18589L0x06b6b51fL,
        
0x9fbfe4a5L0xe8b8d433L0x7807c9a2L0x0f00f934L0x9609a88eL,
        
0xe10e9818L0x7f6a0dbbL0x086d3d2dL0x91646c97L0xe6635c01L,
        
0x6b6b51f4L0x1c6c6162L0x856530d8L0xf262004eL0x6c0695edL,
        
0x1b01a57bL0x8208f4c1L0xf50fc457L0x65b0d9c6L0x12b7e950L,
        
0x8bbeb8eaL0xfcb9887cL0x62dd1ddfL0x15da2d49L0x8cd37cf3L,
        
0xfbd44c65L0x4db26158L0x3ab551ceL0xa3bc0074L0xd4bb30e2L,
        
0x4adfa541L0x3dd895d7L0xa4d1c46dL0xd3d6f4fbL0x4369e96aL,
        
0x346ed9fcL0xad678846L0xda60b8d0L0x44042d73L0x33031de5L,
        
0xaa0a4c5fL0xdd0d7cc9L0x5005713cL0x270241aaL0xbe0b1010L,
        
0xc90c2086L0x5768b525L0x206f85b3L0xb966d409L0xce61e49fL,
        
0x5edef90eL0x29d9c998L0xb0d09822L0xc7d7a8b4L0x59b33d17L,
        
0x2eb40d81L0xb7bd5c3bL0xc0ba6cadL0xedb88320L0x9abfb3b6L,
        
0x03b6e20cL0x74b1d29aL0xead54739L0x9dd277afL0x04db2615L,
        
0x73dc1683L0xe3630b12L0x94643b84L0x0d6d6a3eL0x7a6a5aa8L,
        
0xe40ecf0bL0x9309ff9dL0x0a00ae27L0x7d079eb1L0xf00f9344L,
        
0x8708a3d2L0x1e01f268L0x6906c2feL0xf762575dL0x806567cbL,
        
0x196c3671L0x6e6b06e7L0xfed41b76L0x89d32be0L0x10da7a5aL,
        
0x67dd4accL0xf9b9df6fL0x8ebeeff9L0x17b7be43L0x60b08ed5L,
        
0xd6d6a3e8L0xa1d1937eL0x38d8c2c4L0x4fdff252L0xd1bb67f1L,
        
0xa6bc5767L0x3fb506ddL0x48b2364bL0xd80d2bdaL0xaf0a1b4cL,
        
0x36034af6L0x41047a60L0xdf60efc3L0xa867df55L0x316e8eefL,
        
0x4669be79L0xcb61b38cL0xbc66831aL0x256fd2a0L0x5268e236L,
        
0xcc0c7795L0xbb0b4703L0x220216b9L0x5505262fL0xc5ba3bbeL,
        
0xb2bd0b28L0x2bb45a92L0x5cb36a04L0xc2d7ffa7L0xb5d0cf31L,
        
0x2cd99e8bL0x5bdeae1dL0x9b64c2b0L0xec63f226L0x756aa39cL,
        
0x026d930aL0x9c0906a9L0xeb0e363fL0x72076785L0x05005713L,
        
0x95bf4a82L0xe2b87a14L0x7bb12baeL0x0cb61b38L0x92d28e9bL,
        
0xe5d5be0dL0x7cdcefb7L0x0bdbdf21L0x86d3d2d4L0xf1d4e242L,
        
0x68ddb3f8L0x1fda836eL0x81be16cdL0xf6b9265bL0x6fb077e1L,
        
0x18b74777L0x88085ae6L0xff0f6a70L0x66063bcaL0x11010b5cL,
        
0x8f659effL0xf862ae69L0x616bffd3L0x166ccf45L0xa00ae278L,
        
0xd70dd2eeL0x4e048354L0x3903b3c2L0xa7672661L0xd06016f7L,
        
0x4969474dL0x3e6e77dbL0xaed16a4aL0xd9d65adcL0x40df0b66L,
        
0x37d83bf0L0xa9bcae53L0xdebb9ec5L0x47b2cf7fL0x30b5ffe9L,
        
0xbdbdf21cL0xcabac28aL0x53b39330L0x24b4a3a6L0xbad03605L,
        
0xcdd70693L0x54de5729L0x23d967bfL0xb3667a2eL0xc4614ab8L,
        
0x5d681b02L0x2a6f2b94L0xb40bbe37L0xc30c8ea1L0x5a05df1bL,
        
0x2d02ef8dL
};
DWORD KFile::GetFileCRC32(LPCTSTR lpszFileName, 
int nType /* = 0 */)
{    
    HANDLE hFile 
= ::CreateFile(lpszFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
                           NULL, OPEN_EXISTING,
                          FILE_FLAG_SEQUENTIAL_SCAN, NULL);

    
if  ( hFile == INVALID_HANDLE_VALUE )  return 0;
    DWORD dwSize 
= ::GetFileSize(hFile, NULL);     
    
char*   pData = new  char[ dwSize ];
    
if  ( pData == NULL )  return -1;

    DWORD bytes_read 
= 0  ;
    ::ReadFile(hFile,pData,dwSize,
&bytes_read, NULL);
    ::CloseHandle(hFile);    
    
    
//计算crc
    char*  pCrcData = pData;
    ULONG  crc(
0xffffffff);    
    
while(dwSize--)
        crc 
= (crc >> 8^ Crc32Table[(crc & 0xFF^ *pCrcData++];

    delete [] pData;
    
return crc^0xffffffff;    
}
posted @ 2009-08-05 14:26  独奏者  阅读(2018)  评论(0编辑  收藏  举报