C++ MD5.update每次调用返回随机结果的问题

本文探讨了在读取Lua文件并计算其MD5值时遇到的问题,详细分析了使用std::string转换过程中出现随机结果的原因,并提供了两种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现的功能很简单,读取一个lua文件,计算其md5码

起初的写法是:

{

const char* pszFilePath = "xxx/xxx/xxx.lua";

unsigned long dwSize = 0;

unsigned char *pbBuffer = GetFileData(pszFilePath,&dwSize); //读取文件

std::string strBuffer((const char*)pbBuffer);

GetMd5(strBuffer); //计算md5

}

其中 GetMd5是这样定义的 :

std::string GetMd5(std::string &strBuf)

{

     MD5 md5(strBuf.c_str(),strBuf.size());

     return md5.toString();

}

结果读取同一个文件几次计算出的MD5不同,是随机字符串,几次正确几次错误,查了很久才发现,问题出在字符串转换上,

std::string strBuffer((const char*)pbBuffer); 

读取文件的函数GetFileData中,申请的字符数组大小为文件字节大小,不含 ‘\0’ 结束符号,在转换成std::string的时候,会截取到一个随机的有'\0'的内存处,导致std::string的值是不固定的,不幸的情况下会是正常的,幸运的话是错误的。

解决方法:

第一种:GetFileData读取文件的函数中申请的字符数组size加1,并且设置最后一个字符为'\0'.

第二种:不进行std::string类型转换,直接传入unsigned char *pbBuffer 计算md5,相应的GetMd5方法改为:

std::string GetMd5(void *pBuf , size_t size)

{

    MD5 md5(pBuf,size);

    return md5.toString();

}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥游侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值