//VS2005、VC6下编译通过,CRC校验的函数及相关内容是网上找的,自己稍微改动下,写了个校验文件用的调用示例 #include<windows.h> #define CRC32_POLYNOMIAL 0xEDB88320 unsigned long tableCRC32[256]; void InitializeTableCRC32(); unsigned long GetCRC32(PTCHAR buffer, unsigned long length); unsigned long GetFileCRC32(const PTCHAR szFileName); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PTCHAR szCmdLine,int iCmdShow) { TCHAR szTemp[256]; InitializeTableCRC32(); wsprintf(szTemp,TEXT("%08X"),GetFileCRC32(TEXT(".//测试文件.txt"))); MessageBox(NULL,szTemp,TEXT("标题"),0); } void InitializeTableCRC32() { int i, j; unsigned long h = 1; tableCRC32[0] = 0; for (i = 128; i; i >>= 1) { h = (h >> 1) ^ ((h & 1) ? CRC32_POLYNOMIAL : 0); for (j = 0; j < 256; j += 2 * i) { tableCRC32[i + j] = tableCRC32[j] ^ h; } } } unsigned long GetCRC32(char *buffer, unsigned long length) { unsigned long crc; crc = 0xFFFFFFFF; while (length--) { crc = (crc >> 8) ^ tableCRC32[(crc ^ *buffer++) & 0xFF]; } return crc ^ 0xFFFFFFFF; } unsigned long GetFileCRC32(const PTCHAR szFileName) { HANDLE hFile; char *buffer; unsigned long length,bytesReadWrite,crc; hFile=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);//打开文件 if(hFile==INVALID_HANDLE_VALUE) { return -1; } length=GetFileSize(hFile,NULL); buffer=(char *)VirtualAlloc(NULL,length,MEM_RESERVE|MEM_COMMIT,PAGE_EXECUTE_READWRITE); if(!ReadFile(hFile,buffer,length,&bytesReadWrite,NULL)) { return -1; } CloseHandle(hFile);//关闭文件 crc=GetCRC32(buffer,length); VirtualFree(buffer,0,MEM_RELEASE); return crc; }