用windows api 计算文件的md5值
生活随笔
收集整理的這篇文章主要介紹了
用windows api 计算文件的md5值
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我自己封裝了一個(gè)函數(shù)GetMd5(LPCWSTR FileDirectory)。其中調(diào)用了windows api:CryptAcquireContext,CryptCreateHash,CryptHashData等。要計(jì)算不同文件的md5值,只需在調(diào)用此函數(shù)時(shí)傳入不同文件的全路徑即可,不需要額外的dll。示例代碼在vs2008中測(cè)試通過(guò):
#include "stdafx.h" #include <iostream> #include "windows.h" using namespace std;void GetMd5(LPCWSTR FileDirectory) {HANDLE hFile=CreateFile(FileDirectory,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL);if (hFile==INVALID_HANDLE_VALUE) //如果CreateFile調(diào)用失敗{cout<<"CreateFile go wrong :"<<GetLastError()<<endl; //提示CreateFile調(diào)用失敗,并輸出錯(cuò)誤號(hào)。visual studio中可在“工具”>“錯(cuò)誤查找”中利用錯(cuò)誤號(hào)得到錯(cuò)誤信息。CloseHandle(hFile);}HCRYPTPROV hProv=NULL;if(CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT)==FALSE) //獲得CSP中一個(gè)密鑰容器的句柄{cout<<"CryptAcquireContext go wrong:"<<GetLastError()<<endl;}HCRYPTPROV hHash=NULL;if(CryptCreateHash(hProv,CALG_MD5,0,0,&hHash)==FALSE) //初始化對(duì)數(shù)據(jù)流的hash,創(chuàng)建并返回一個(gè)與CSP的hash對(duì)象相關(guān)的句柄。這個(gè)句柄接下來(lái)將被CryptHashData調(diào)用。{cout<<"CryptCreateHash go wrong:"<<GetLastError()<<endl;}DWORD dwFileSize=GetFileSize(hFile,0); //獲取文件的大小if (dwFileSize==0xFFFFFFFF) //如果獲取文件大小失敗{cout<<"GetFileSize go wrong:"<<GetLastError()<<endl;}byte* lpReadFileBuffer=new byte[dwFileSize];DWORD lpReadNumberOfBytes;if (ReadFile(hFile,lpReadFileBuffer,dwFileSize,&lpReadNumberOfBytes,NULL)==0) //讀取文件{cout<<"ReadFile go wrong:"<<GetLastError()<<endl;}if(CryptHashData(hHash,lpReadFileBuffer,lpReadNumberOfBytes,0)==FALSE) //hash文件{cout<<"CryptHashData go wrong:"<<GetLastError()<<endl;}delete[] lpReadFileBuffer;CloseHandle(hFile); //關(guān)閉文件句柄BYTE *pbHash;DWORD dwHashLen=sizeof(DWORD);//以下注釋掉的代碼不用使用,因?yàn)橐呀?jīng)知道m(xù)d5值就占32個(gè)字節(jié),沒(méi)有必要通過(guò)CryptGetHashParam函數(shù)來(lái)得到字節(jié)數(shù)。/*BYTE *pbHashSize;if (!(pbHashSize=(byte*)malloc(dwHashLen))) //為pbHashSize分配內(nèi)存{cout<<"memory allocation failed:"<<GetLastError()<<endl;}//將第二個(gè)參數(shù)的值設(shè)為HP_HASHSIZE。dwHashLen中存放著hash值的字節(jié)數(shù)。這個(gè)調(diào)用必須在將第三個(gè)參數(shù)設(shè)置為HP_HASHVAL的調(diào)用前,這樣才能分配正確數(shù)量的內(nèi)存。if (CryptGetHashParam(hHash,HP_HASHSIZE,pbHashSize,&dwHashLen,0)) {free(pbHashSize);}else{cout<<"get size go wrong"<<GetLastError()<<endl;}*/if (CryptGetHashParam(hHash,HP_HASHVAL,NULL,&dwHashLen,0)) //我也不知道為什么要先這樣調(diào)用CryptGetHashParam,這塊是參照的msdn {}else{cout<<"get length wrong"<<endl;}if(pbHash=(byte*)malloc(dwHashLen)){}else{cout<<"allocation failed"<<endl;}if(CryptGetHashParam(hHash,HP_HASHVAL,pbHash,&dwHashLen,0)) //獲得md5值{for(DWORD i=0;i<dwHashLen;i++) //輸出md5值{printf("%02x",pbHash[i]);}cout<<endl;}//善后工作if(CryptDestroyHash(hHash)==FALSE) //銷毀hash對(duì)象{cout<<"CryptDestroyHash go wrong:"<<GetLastError()<<endl;}if(CryptReleaseContext(hProv,0)==FALSE){cout<<"CryptReleaseContext go wrong:"<<GetLastError()<<endl;} }int _tmain(int argc, _TCHAR* argv[]) {GetMd5(L"C:\\Windows\\System32\\kernel32.dll");system("pause");return 0; } 此代碼輸出系統(tǒng)文件kernel32.dll的md5值,在我電腦上運(yùn)行結(jié)果如下圖所示:
總結(jié)
以上是生活随笔為你收集整理的用windows api 计算文件的md5值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle varchar2改成大字段
- 下一篇: “Found interface com