VC/MFC 获取文件MD5值 获取大文件MD5值 命令行版

 

文件下载

获取大文件MD5值Windows命令行版-CSDN下载

使用方法

1、打开CMD,

2、CD到md5.exe所在目录(把MD5.exe放到System32下可省略步骤),

3、CMD中输入命令: md5 文件路径(也可在输入md5空格后把文件拖进CMD),回车即可获得文件的MD5值。

完整项目下载

完整项目(源代码)-CSDN下载

源代码

/*
	功能: 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;
}

相关链接: VC/MFC 获取文件MD5值 获取大文件MD5值 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值