文件下载
使用方法
1、打开CMD,
2、CD到md5.exe所在目录(把MD5.exe放到System32下可省略步骤),
3、CMD中输入命令: md5 文件路径(也可在输入md5空格后把文件拖进CMD),回车即可获得文件的MD5值。
完整项目下载
源代码
/*
功能: Windows 系统获取大文件MD5值
编译环境: VS2017,字符集可随意切换
基于官方API示例封装
*/
#include <iostream>
#include <windows.h>
#include <wincrypt.h>
#include <tchar.h>
#define BUFSIZE 1024
#define MD5LEN 16
// 功能: 获取文件MD5值
// TCHAR* tchFile 要获取MD5值的文件绝对路径, 例如: C:\\a.txt
// TCHAR* tchMd5 保存MD5值
DWORD GetFileMD5(TCHAR* tchFile, TCHAR* tchMd5);
int _tmain(int argc, TCHAR **argv)
{
#ifdef UNICODE
setlocale(LC_ALL, "zh_CN.UTF-8");
#endif
if (argc != 2)
{
_tprintf(_T("参数错误, 参数一为文件绝对路径,例如: c:\\a.txt \n"));
return -1;
}
// 测试视频文件大小超过 5GB
//TCHAR tchFile[] = _T("z:\\20220117_201714.mp4");
TCHAR tchMd5[33]{ 0 };
DWORD dwStatus = GetFileMD5(argv[1], tchMd5);
_tprintf(_T("MD5 hash of file %s is: %s\n"), argv[1], tchMd5);
return 0;
}
DWORD GetFileMD5(TCHAR* tchFile, TCHAR* tchMd5)
{
DWORD dwStatus = 0;
BOOL bResult = FALSE;
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
HANDLE hFile = NULL;
BYTE rgbFile[BUFSIZE];
DWORD cbRead = 0;
BYTE rgbHash[MD5LEN];
DWORD cbHash = 0;
constexpr CHAR rgbDigits[] = "0123456789abcdef";
// Logic to check usage goes here.
do
{
hFile = CreateFile(tchFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
dwStatus = GetLastError();
_tprintf(_T("Error opening file %s\nError: %d\n"), tchFile, dwStatus);
break;
}
// Get handle to the crypto provider
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
{
dwStatus = GetLastError();
_tprintf(_T("CryptAcquireContext failed: %d\n"), dwStatus);
break;
}
if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
{
dwStatus = GetLastError();
_tprintf(_T("CryptAcquireContext failed: %d\n"), dwStatus);
break;
}
while (bResult = ReadFile(hFile, rgbFile, BUFSIZE, &cbRead, NULL))
{
if (0 == cbRead) break;
if (!CryptHashData(hHash, rgbFile, cbRead, 0))
{
dwStatus = GetLastError();
_tprintf(_T("CryptHashData failed: %d\n"), dwStatus);
break;
}
}
if (!bResult)
{
dwStatus = GetLastError();
_tprintf(_T("ReadFile failed: %d\n"), dwStatus);
break;
}
cbHash = MD5LEN;
if (CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0))
{
char chMd5[33]{ 0 };
for (DWORD i = 0; i < cbHash; i++)
{
CHAR tmp[3]{ 0 };
sprintf_s(tmp, "%c%c", rgbDigits[rgbHash[i] >> 4], rgbDigits[rgbHash[i] & 0xf]);
for (auto &i : tmp)
{
if (i >= 0x61 && i <= 0x7A) {
i ^= (1 << 5);
}
}
#ifdef _UNICODE
strcat_s(chMd5, 33, tmp);
#else
strcat_s(tchMd5, 33, tmp);
#endif
}
#ifdef _UNICODE
MultiByteToWideChar(CP_ACP, 0, chMd5, 32, tchMd5, 32);
#endif
}
else
{
dwStatus = GetLastError();
_tprintf(_T("CryptGetHashParam failed: %d\n"), dwStatus);
}
} while (0);
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
CloseHandle(hFile);
return dwStatus;
}