分享

VC 实现获取文件的CRC32值

 guoliyan1 2012-02-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;
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多