16,473
社区成员
发帖
与我相关
我的任务
分享
unsigned long Crc32Table[256];
void MakeTable()//动态生成CRC32的码表
{
int i,j;
unsigned long crc;
for (i = 0; i < 256; i++)
{
crc = i;
for (j = 0; j < 8; j++)
{
if (crc & 1)
crc = (crc >> 1) ^ 0xEDB88320;
else
crc >>= 1;
}
Crc32Table[i] = crc;
}
}
int Get_CRC(CString &csData, DWORD dwSize)//获取crc32值
{
ULONG crc(0xffffffff);
int len;
unsigned char* buffer;
len = dwSize;
buffer = (unsigned char*)(LPCTSTR)csData;
while(len--)
crc = (crc >> 8) ^ Crc32Table[(crc & 0xFF) ^ *buffer++];
return crc^0xffffffff;
}
void CCRC32Dlg::OnBnClicledOK()
{
// TODO: Add your control notification handler code here
HANDLE hFile = {NULL};
DWORD dwSize, bytes_read;
CString FileNameStr;
MakeTable();//生成码表
//打开对话框
CFileDialog dlg(TRUE, NULL, "", OFN_HIDEREADONLY,
"All Files (*.*)|*.*||", this);
if(IDOK != dlg.DoModal())
return;
FileNameStr = dlg.GetPathName();
hFile = CreateFile(FileNameStr, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN, NULL);
dwSize = GetFileSize(hFile, NULL);
CString csData(' ', dwSize);
ReadFile(hFile, csData.GetBuffer(dwSize), dwSize, &bytes_read, NULL);
CloseHandle(hFile);
csData.ReleaseBuffer();
int nCRC = Get_CRC(csData, dwSize);
char ch[20];
itoa(nCRC, ch, 16);
CString m_FileCrcValue;
m_FileCrcValue= ch;
m_FileCrcValue.MakeUpper();
CEdit * crc=(CEdit*)GetDlgItem(IDC_EDIT_CRC);
crc->SetWindowTextA(m_FileCrcValue);
UpdateData(FALSE);
}