首页 > 系统相关 >Windows平台下使用C++计算文件MD5的方法

Windows平台下使用C++计算文件MD5的方法

时间:2024-05-30 12:02:55浏览次数:34  
标签:NULL return hFile Windows ScopedExit C++ result include MD5

#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <string>
#include <cassert>
#include <functional>

typedef std::basic_string<TCHAR> StringT;
typedef std::string StringA;

#define _PP_CAT_IMPL_(a, b ) a ## b
#define PP_CAT(a, b) _PP_CAT_IMPL_( a, b )

namespace Details
{
    template <typename TCallable>
    class ScopedExit
    {
    public:
        ScopedExit(TCallable func) :
            Func(func)
        {
        }

        ~ScopedExit()
        {
            Func();
        }

        ScopedExit(const ScopedExit&) = delete;
        const ScopedExit& operator=(const ScopedExit&) = delete;

    private:
        TCallable Func;
    };
}

#define SCOPED_EXIT(expression) \
	::Details::ScopedExit<std::function<void()> > PP_CAT(ScopedExitInstalce_, __COUNTER__)([&]()\
{ \
	expression;\
})


StringA CalculateFileMD5(const StringT& filepath)
{
#define BUFSIZE 1024
#define MD5LEN  16

    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;
    CHAR rgbDigits[] = "0123456789abcdef";
    // Logic to check usage goes here.

    hFile = CreateFile(filepath.c_str(),
        GENERIC_READ,
        FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_SEQUENTIAL_SCAN,
        NULL);

    if (INVALID_HANDLE_VALUE == hFile)
    {
        return "";
    }

    SCOPED_EXIT(CloseHandle(hFile));

    // Get handle to the crypto provider
    if (!CryptAcquireContext(&hProv,
        NULL,
        NULL,
        PROV_RSA_FULL,
        CRYPT_VERIFYCONTEXT))
    {
        return "";
    }

    SCOPED_EXIT(CryptReleaseContext(hProv, 0));

    if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
    {
        return "";
    }

    SCOPED_EXIT(CryptDestroyHash(hHash));

    while (bResult = ReadFile(hFile, rgbFile, BUFSIZE, &cbRead, NULL))
    {
        if (0 == cbRead)
        {
            break;
        }

        if (!CryptHashData(hHash, rgbFile, cbRead, 0))
        {
            return "";
        }
    }

    if (!bResult)
    {
        return "";
    }

    cbHash = MD5LEN;
    if (CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0))
    {
        StringA result;
        result.reserve(40);

        for (DWORD i = 0; i < cbHash; i++)
        {
            result.push_back(rgbDigits[rgbHash[i] >> 4]);
            result.push_back(rgbDigits[rgbHash[i] & 0xf]);
        }

        return result;
    }

    return "";
}

int main()
{
    auto md5 = CalculateFileMD5(_T("E:\\aow-install-apk-100.xml"));
    std::cout << md5 << std::endl;

    return 0;
}

  测试:

 

标签:NULL,return,hFile,Windows,ScopedExit,C++,result,include,MD5
From: https://www.cnblogs.com/bodong/p/18222073

相关文章

  • windows镜像虚拟机创建共享文件夹详细步骤 -- 和本地电脑传输文件
    第一步:关闭客户机第二步:右击“虚拟机名称”或菜单栏的“虚拟机”–>“设置”网络适配器选择NAT或者其他的都可以来到“选项”,启用共享文件夹,具体如下图:点击添加,添加主机文件夹。然后确定 第三步:开启虚拟机,打开虚拟机内的“我的电脑”,如果有下图所示的网络共享文件夹,则......
  • 二叉树的创建与遍历(附有C++实现详细代码)
    一、引言在计算机科学中,二叉树是一种常见的数据结构,它的每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的应用广泛,包括但不限于搜索算法、排序算法、存储结构等。本文将详细讨论二叉树的创建与遍历方法,并通过代码示例进行说明。二、二叉树的基本概念在介......
  • C++实现哈夫曼树
    哈夫曼树(HuffmanTree)是一种特殊的二叉树,通常用于数据压缩的哈夫曼编码。在哈夫曼树中,频率(或权重)较高的节点离根节点较远,而频率较低的节点离根节点较近。这样,我们可以为频率较低的节点分配较短的编码,为频率较高的节点分配较长的编码,从而实现数据的压缩。本文将详细介绍如何......
  • Windows镜像ISO下载以及永久使用(亲测有效)
    1、镜像ISO文件下载点击立即下载工具按钮,先下载这个工具双击下载好的工具MediaCreationTool22H2下载时间需要一会儿,下载好ISO文件,关闭窗口即可。2、工具下载下载工具下载地址https://pan.baidu.com/s/1KoQ9lhFdrYNd2dDb7539Ng?pwd=wnbt说明:下载工具......
  • windows系统电脑外插键盘驱动出现感叹号或者显示未知设备,键盘无法输入的解决办法
    笔记本外插的键盘不能用,鼠标可以使用。 查找故障,结果打开设备管理器看到键盘那项里是一个的黄色惊叹号显示未知设备![图片]如下图所示          其实解决办法很简单,不要相信网上的一些博主说删除什么注册表,我开始跟着他们操作,把我电脑自带的键盘都弄失灵了,......
  • Windows驱动开发涉及到许多重要的概念和技术,包括调试、进程管理、文件操作、注册表访
    Windows驱动开发涉及到许多重要的概念和技术,包括调试、进程管理、文件操作、注册表访问、系统调用、IRP(I/ORequestPacket)和锁原理。以下是对每个主题的简要介绍:调试Windows驱动程序的调试通常涉及使用调试器(如WinDbg)来分析驱动程序的运行时行为,包括查看内存、寄存器状态、......
  • paddleXOCR c++ vs2022编译以及使用
    PaddleOCR的使用(C++)——Windows编译篇-夕西行-博客园(cnblogs.com) 参考官方的指导地址,按照他的来很全PaddleOCR/deploy/cpp_infer/docs/windows_vs2019_build.mdatmain·PaddlePaddle/PaddleOCR·GitHub1.opencv我这里用的4.4(高版本应该也可以)Releases-OpenC......
  • Windows 服务漏洞的原理和可能的利用方式
    理解Windows服务的原理以及RPC(远程过程调用)和COM(组件对象模型)接口是非常重要的,因为它们在Windows系统中扮演着关键的角色。让我简单地为您解释一下它们的基本概念:Windows服务原理:Windows服务是在后台运行的应用程序,无需用户交互界面即可执行指定的任务。服务以系统......
  • C++设计模式的原则
    1、依赖倒置原则(DIP)·高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象稳定)。·抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)。2、开放封闭原则(OCP)·对扩展开放,对更改封闭。·类模块应该是可扩展的,但是不可修改。3、单一职责原......
  • WindowsCA证书服务(六)为CAweb颁发机构配置证书
    简介CA搭建好了,证书也申请了,完了么?没有,连一半都没有做完,凑活到不及格。为什么不及格,中级课程才刚开始:CAweb颁发证书,ocsp联机响应,crl注销列表,aia授权列表,自动备份,手动恢复,信任冲突,代码签名……为CAweb申请证书自己发证书,自己都没有证书,真惭愧啊,不过这顺序是为了方便简单凑活的......