QT5.14.2 探索QT的神秘力量:轻松获取MD5值的秘诀


在当今这个信息爆炸的时代,数据安全已经成为了我们每个人都需要关注的话题。MD5作为一种广泛使用的哈希算法,它的应用场景非常广泛,从密码存储到文件完整性校验,MD5都扮演着重要的角色。而在QT的世界里,获取MD5值就像吃一块蛋糕一样简单。今天,我将带你深入了解如何在QT中轻松获取MD5值。


QT中的QCryptographicHash类


QT框架为我们提供了一个强大的类——QCryptographicHash,它支持MD5、MD4、SHA1等多种哈希算法。这个类的使用非常简单,你只需要实例化它,然后通过addData()方法添加数据,最后通过result()方法获取哈希结果。


一、字符串转MD5的两种方法

方法一:逐步添加数据
  1. 实例化QCryptographicHash对象,并指定使用MD5算法。
  2. 将要转换的字符串转换为QByteArray
  3. 使用addData()方法添加数据。
  4. 通过result()方法获取哈希结果,并使用toHex()转换为十六进制字符串。
QString pwd = "123456";
QCryptographicHash md(QCryptographicHash::Md5);
QByteArray ba = pwd.toUtf8();
md.addData(ba);
QByteArray hash = md.result();
QString md5 = hash.toHex();

方法二:一次性获取哈希值

如果你的数据已经是一个QByteArray,可以直接使用QCryptographicHash::hash()静态方法来获取MD5值。

QString pwd = "123456";
QByteArray hash = QCryptographicHash::hash(pwd.toAscii(), QCryptographicHash::Md5);
QString md5 = hash.toHex();

二、获取文件的MD5码

对于文件的MD5值获取,QT同样提供了简洁的解决方案。

QFile theFile("path/to/your/file");
theFile.open(QIODevice::ReadOnly);
QByteArray fileData = theFile.readAll();
QCryptographicHash fileHash(QCryptographicHash::Md5);
fileHash.addData(fileData);
QByteArray fileMd5 = fileHash.result();

但是,当文件较大时,我们需要采取一种更为高效的方法来避免内存溢出。上述方法可能会因为一次性读取过多数据而导致程序崩溃。

这时,我们需要分块读取文件内容,并逐步更新MD5值。


下面是一个详细的实现步骤,展示了如何在QT中获取大文件的MD5码:

步骤 1: 引入必要的头文件

首先,你需要包含QT的QFileQCryptographicHashQIODevice等头文件。

#include <QFile>
#include <QCryptographicHash>
#include <QIODevice>

步骤 2: 打开文件

使用QFile类打开你想要计算MD5的文件。确保以只读模式打开文件。

QFile file("path/to/your/file");
if (!file.open(QIODevice::ReadOnly)) {qFatal("Cannot open file for reading: %s", qPrintable(file.errorString()));return;
}

步骤 3: 创建MD5哈希对象

使用QCryptographicHash类创建一个MD5哈希对象。

QCryptographicHash md5Hash(QCryptographicHash::Md5);

步骤 4: 读取文件并更新哈希

为了处理大文件,你需要分块读取文件内容。这里,我们使用一个合理的块大小(例如,1024字节),这样可以有效地避免内存问题。

const quint64 bufferSize = 1024 * 4; // 4KB缓冲区
QByteArray buffer;
while (!file.atEnd()) {// 读取一块数据buffer = file.read(bufferSize);if (buffer.isEmpty()) {break; // 文件结束或读取错误}// 更新MD5哈希md5Hash.addData(buffer);
}

步骤 5: 完成哈希计算并获取结果

当文件的所有数据块都被处理完毕后,调用result()方法来完成哈希计算,并获取最终的MD5哈希值。

QByteArray fileMd5 = md5Hash.result();

步骤 6: 转换为十六进制字符串

使用toHex()方法将二进制的MD5哈希值转换为十六进制的字符串表示形式。

QString md5String = fileMd5.toHex();

步骤 7: 关闭文件

最后,确保关闭文件以释放资源。

file.close();

### 完整代码示例
#include <QCoreApplication>
#include <QFile>
#include <QCryptographicHash>
#include <QIODevice>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QString filePath = "path/to/your/file";QFile file(filePath);if (!file.open(QIODevice::ReadOnly)) {qFatal("Cannot open file for reading: %s", qPrintable(file.errorString()));return -1;}QCryptographicHash md5Hash(QCryptographicHash::Md5);const quint64 bufferSize = 1024 * 4; // 4KB缓冲区QByteArray buffer;while (!file.atEnd()) {buffer = file.read(bufferSize);if (buffer.isEmpty()) {break; // 文件结束或读取错误}md5Hash.addData(buffer);}QByteArray fileMd5 = md5Hash.result();QString md5String = fileMd5.toHex();qDebug() << "MD5 Hash of the file:" << md5String;file.close();return 0;
}

这个程序将打印出指定文件的MD5哈希值。通过这种方式,你可以有效地计算任何大小文件的MD5值,而不必担心内存问题。


补充:QByteArray的toHex()方法解析

在QT中,QByteArray存储的十六进制数是以ASCII码形式存储的。例如,十六进制数0x9f实际存储为'\x9f'。使用toHex()方法可以将这种存储形式转换为纯文本形式的“9f”。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三方 cookie 就快被废弃了,再不玩就没机会了!

还记得初学前端时&#xff0c;一直听过 cookie&#xff0c;没碰它之前觉得特别简单&#xff0c;一听就懂。但当自己和后台成员对接时&#xff0c;那叫一个惨烈&#xff0c;搞了搞几天才好&#xff0c;最后弄好的时候还是懵懵的。最近突然看到第三方 cookie 快被废弃了&#xff…

洛谷 B3625 迷宫寻路

本道题需要注意&#xff1a;如果孩子的起始位置就是‘#’&#xff0c;那孩子就无路可走&#xff0c;出不来了。 所以需要特判一下&#xff0c;代码如下&#xff1a;&#xff08;这是废话&#xff0c;不需要特判&#xff0c;注意题目要求&#xff09; if(ch[1][1]#){printf(&q…

基于51单片机的数控直流可调电源设计[proteus仿真]

181基于51单片机的数控直流可调电源设计[proteus仿真] 电源系统这个题目算是课程设计和毕业设计中常见的题目了&#xff0c;本期是一个基于51单片机的数控直流可调电源设计 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&#xffe…

动态内存管理(下)

1.C/C程序的内存开辟 C/C程序内存分配的几个区域&#xff1a; 1. 栈区&#xff08;stack&#xff09;&#xff1a;在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中…

谈谈你对Java平台的理解?

从你接触 Java 开发到现在&#xff0c;你对 Java 最直观的印象是什么呢&#xff1f;是它宣传的 “Write once, run anywhere”&#xff0c;还是目前看已经有些过于形式主义的语法呢&#xff1f;你对于 Java 平台到底了解到什么程度&#xff1f;请你先停下来总结思考一下。 今天…

java面试(缓存Redis)

为什么使用缓存 高性能&#xff0c;高可用&#xff0c;高并发。 什么是缓存击穿&#xff1f;缓存穿透&#xff1f;缓存雪崩&#xff1f; 击穿&#xff1a;redis中没有查询到数据。解决&#xff1a;设置热点数据永不过期。加载DB时防止并发。 穿透&#xff1a;redis和mysql中…

Java知识点之单例模式

1、单例模式&#xff08;Binary Search&#xff09; 单例模式确保某个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例。在计算机系统中&#xff0c;线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资…

TikTok新手如何起号?环境因素与内容创新技巧

相信很多刚入行的TikTok玩家都遇到过一个难题&#xff0c;那就是账号权重低&#xff0c;播放量在个位数徘徊&#xff0c;其实都是因为还没起号&#xff01;那么具体如何起号呢&#xff1f;下面小编也给大家分享一下技巧。 一、如何起号 1、明确注册 TikTok 账号的目的 无论是…

Day46| 139 单词拆分

目录 139 单词拆分 139 单词拆分 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordset(wordDict.begin(), wordDict.end());//dp数组来判断i长度时能不能被字典里面的单词所组成vector<bool&g…

怎么把mp4转换成amv格式?如何下载amv格式视频?

MP4&#xff08;MPEG-4 Part 14&#xff09;是一种通用的视频文件格式&#xff0c;广泛用于多媒体应用。作为MPEG-4标准的一部分&#xff0c;MP4以其卓越的压缩性能、出色的视频质量和广泛的兼容性成为当前最流行的视频格式之一。 AMV文件格式的介绍 AMV文件格式起源于中国公司…

深入理解JAVA异常(自定义异常)

目录 异常的概念与体系结构 异常的概念&#xff1a; 异常的体系结构&#xff1a; 异常的分类&#xff1a; 异常的处理 防御式编程 LBYL: EAFP: 异常的抛出 异常的捕获 异常声明throws try-catch捕获并处理 finally 面试题&#xff1a; 异常的处理流程 异常处…

计算机网络——OSI网络层次模型

计算机网络——OSI网络层次模型 应用层表示层会话层传输层TCP和UDP协议复用分用 网络层数据链路层物理层OSI网络层次模型中的硬件设备MAC地址和IP地址MAC地址IP地址MAC地址和IP地址区别 OSI网络层次模型通信过程解释端到端点到点端到端和点到点的区别 我们之前简单介绍了一下网…

sqllab第十三关通关笔记

知识点&#xff1a; 登录框处常见的语句(一般都是查询语句) where usernamewhere username""where usernam()where username("")错误注入知识回顾这里使用错误注入 通过admin admin登录发现没有任何回显信息&#xff1b;但是有成功登录的提示 通过bp抓包…

CSPM有必要换吗?目前持有PMP?

从事项目管理岗位的&#xff0c;尤其是国企工作的&#xff0c;建议换一个&#xff0c;但是有进一步发展打算的&#xff0c;可以直接考CSPM-3级更好&#xff0c;PMP持证增持的是CSPM-2级证书&#xff0c;相对来说是个初级证书&#xff0c;CSPM-3级含金量更高。 一、什么是 CSPM…

美众议院通过强制要求 TikTok 剥离的法案; 首个 AI 软件工程师上线丨 RTE 开发者日报 Vol.165

开发者朋友们大家好&#xff1a; 这里是**「RTE 开发者日报」**&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 …

交换机/路由器的存储介质-华为

交换机/路由器的存储介质-华为 本文主要介绍网络设备的存储介质组成。 SDRAM&#xff08;同步动态随机存取内存&#xff09; 系统运行内存&#xff0c;相当于电脑的内存&#xff1b; NVRAM&#xff08;Non-Volatile Random Access Memory&#xff0c;非易失性随机访问存储器…

【C++】vector的底层剖析以及模拟实现

一、vector的简单认识 vector是表示可变大小数组的序列容器。 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c…

高等数学相关知识点整理汇总

说明&#xff1a;由于工作原因可能更新不及时&#xff0c;内容逐步完善中… 一、空间解析几何与向量代数 二、多元函数的微分学 三、重积分 四、曲线积分与曲面积分 五、常微分方程 六、无穷级数

WPF中的ListBox样式(没被选择有点模糊,选中清晰,鼠标进入变大,移出变小)

<Style TargetType"ListBoxItem"><!-- 没有被选中就是有点模糊 --><Setter Property"Opacity" Value"0.5" /><Setter Property"MaxHeight" Value"75" /><Style.Triggers><!-- 触发器设…

基于HarmonyOS ArkTS中秋国庆祝福程序、以代码之名,写阖家团圆祝福

中秋、国庆双节将至&#xff0c;作为程序员&#xff0c;以代码之名&#xff0c;表达对于阖家团圆的祝福。本节将演示如何在基于HarmonyOS ArkUI的SwiperController、Image、Swiper等组件来实现节日祝福轮播程序。 规则要求具体要求如下&#xff1a; 1、根据主题&#xff0c;用…