⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crcfromasm.cpp

📁 局域网内简单的TCP/IP文件互传程序
💻 CPP
字号:
//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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -