用windows api 计算文件的md5值
生活随笔
收集整理的這篇文章主要介紹了
用windows api 计算文件的md5值
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我自己封裝了一個函數GetMd5(LPCWSTR FileDirectory)。其中調用了windows api:CryptAcquireContext,CryptCreateHash,CryptHashData等。要計算不同文件的md5值,只需在調用此函數時傳入不同文件的全路徑即可,不需要額外的dll。示例代碼在vs2008中測試通過:
#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調用失敗{cout<<"CreateFile go wrong :"<<GetLastError()<<endl; //提示CreateFile調用失敗,并輸出錯誤號。visual studio中可在“工具”>“錯誤查找”中利用錯誤號得到錯誤信息。CloseHandle(hFile);}HCRYPTPROV hProv=NULL;if(CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT)==FALSE) //獲得CSP中一個密鑰容器的句柄{cout<<"CryptAcquireContext go wrong:"<<GetLastError()<<endl;}HCRYPTPROV hHash=NULL;if(CryptCreateHash(hProv,CALG_MD5,0,0,&hHash)==FALSE) //初始化對數據流的hash,創建并返回一個與CSP的hash對象相關的句柄。這個句柄接下來將被CryptHashData調用。{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); //關閉文件句柄BYTE *pbHash;DWORD dwHashLen=sizeof(DWORD);//以下注釋掉的代碼不用使用,因為已經知道md5值就占32個字節,沒有必要通過CryptGetHashParam函數來得到字節數。/*BYTE *pbHashSize;if (!(pbHashSize=(byte*)malloc(dwHashLen))) //為pbHashSize分配內存{cout<<"memory allocation failed:"<<GetLastError()<<endl;}//將第二個參數的值設為HP_HASHSIZE。dwHashLen中存放著hash值的字節數。這個調用必須在將第三個參數設置為HP_HASHVAL的調用前,這樣才能分配正確數量的內存。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)) //我也不知道為什么要先這樣調用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對象{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; } 此代碼輸出系統文件kernel32.dll的md5值,在我電腦上運行結果如下圖所示:
總結
以上是生活随笔為你收集整理的用windows api 计算文件的md5值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle varchar2改成大字段
- 下一篇: 第一个 Rails App 从安装到创建