实现的功能很简单,读取一个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();
}