登录站点

用户名

密码

VC++实现CRC32校验值方法

2已有 1681 次阅读  2011-01-16 11:26   标签blank  关键词  黑客 

VC++实现CRC32校验值方法

关键词vc++    crc32                                          

//摘录:文人黑客 0809181652 
//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);

上一篇: 用skinmagic给VC6开发的软件换肤 下一篇: java环境变量配置

分享 举报