剃刀发色:VC 实现获取文件的CRC32值
来源:百度文库 编辑:偶看新闻 时间:2024/04/28 16:54:05
首先在头文件里面申明一下: unsignedlongCrc32Table[256];
代码开始:
voidCGetCrcDlg::OnGetFileCrc()//打开文件然后在EDIT控件里面直接显示文件校验值;
{
HANDLEhFile={NULL};
DWORDdwSize,bytes_read;
CStringFileNameStr;
MakeTable();//生成码表
//打开对话框
CFileDialogdlg(TRUE,NULL,"",OFN_HIDEREADONLY,
"AllFiles(*.*)|*.*||",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);
CStringcsData('',dwSize);
ReadFile(hFile,csData.GetBuffer(dwSize),dwSize,&bytes_read,NULL);
CloseHandle(hFile);
csData.ReleaseBuffer();
intnCRC=Get_CRC(csData,dwSize);
charch[20];
itoa(nCRC,ch,16);
m_FileCrcValue=ch;
m_FileCrcValue.MakeUpper();
UpdateData(FALSE);
}
voidCGetCrcDlg::MakeTable()//动态生成CRC32的码表
{
inti,j;
unsignedlongcrc;
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;
}
}
intCGetCrcDlg::Get_CRC(CString&csData,DWORDdwSize)//获取crc32值
{
ULONG crc(0xffffffff);
intlen;
unsignedchar*buffer;
len=dwSize;
buffer=(unsignedchar*)(LPCTSTR)csData;
while(len--)
crc=(crc>>8)^Crc32Table[(crc&0xFF)^*buffer ];
returncrc^0xffffffff;
}