剃刀发色:VC 实现获取文件的CRC32值

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 16:54:05
获取文件CRC32值VC 实现。。。。。

首先在头文件里面申明一下: 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;
}