在VC中实现快速获取文件的CRC32校验值的方法

定义为类,粘贴以后可以直接使用:

//作者:狂风来临 参考来自: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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值