定义为类,粘贴以后可以直接使用:
//作者:狂风来临 参考来自:http://www.bitencrypt.com的例子。
//CRCFromASM.H
class CAsm
{
public:
CAsm();
virtual ~CAsm();
void MakeTable(void);
void DelTable(void);
BOOL GetFileCrc(LPCTSTR szFilename, DWORD &dwCrc32);
protected:
DWORD *Crc32Table;
};
//CRCFromASM.CPP
#include "stdafx.h"
#include "CRCFromASM.h"
#define MAX_BUFFER_SIZE 4096
//构造函数
CAsm::CAsm()
{
MakeTable();//生成码表
}
//析构函数
CAsm::~CAsm()
{
DelTable();//释放码表所占内存
}
//生成码表
void CAsm::MakeTable(void)
{
int i, j;
DelTable();
Crc32Table = 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) ^ 0xEDB88320;
else
dwCrc >>= 1;
}
Crc32Table[i] = dwCrc;
}
}
//函数码表所占内存
void CAsm::DelTable(void)
{
delete Crc32Table;
}
//获取文件的CRC32值
BOOL CAsm::GetFileCrc(LPCTSTR szFilename, DWORD &dwCrc32)
{
if (lstrlen(szFilename)<1)
{
return FALSE;
}
HANDLE hFile = NULL;
dwCrc32 = 0xFFFFFFFF;
try
{
if(Crc32Table == NULL)
{
return FALSE;
}
hFile = CreateFile(szFilename,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
return FALSE;
}
else
{
BYTE buffer[MAX_BUFFER_SIZE];
DWORD dwBytesRead;
BOOL bSuccess = ReadFile(hFile, buffer, sizeof(buffer), &dwBytesRead, NULL);
while(bSuccess && dwBytesRead)
{
__asm
{
push esi
push edi
mov eax, dwCrc32
mov ecx, [eax]
mov ebx, this
mov edi, [ebx]CAsm.Crc32Table
lea esi, buffer
mov ebx, dwBytesRead
lea edx, [esi + ebx]
crc32loop:
xor eax, eax
mov bl, byte ptr [esi]
mov al, cl
inc esi
xor al, bl
shr ecx, 8
mov ebx, [edi + eax * 4]
xor ecx, ebx
cmp edx, esi
jne crc32loop
pop edi
pop esi
mov eax, dwCrc32
mov [eax], ecx
}
bSuccess = ReadFile(hFile, buffer, sizeof(buffer), &dwBytesRead, NULL);
}
}
}
catch(...)
{
return FALSE;
}
if(hFile != NULL) CloseHandle(hFile);
dwCrc32 = ~dwCrc32;
return TRUE;
}
//调用例子:
DWORD dwCrc32;
CAsm CRCINFO;
if (CRCINFO.GetFileCrc(m_FileName, dwCrc32))
{
CString str;
str.Format(_T("%08X"), dwCrc32);
m_CrcValue=str;
}
else
{
m_CrcValue="函数调用错误!";
}
UpdateData(FALSE);