我试图将一些二进制数据(PDF文件)转换为base64编码,然后将这些数据放入xml文件中以进行某些网络操作。
现在问题是,我相信我没有正确地将pdf文件读取(参见下面的方法)到内存缓冲区中。在读取pdf数据之后,我进入字符缓冲区并传递给编码器方法的是返回一些base64编码的字符串,但在解码时,无法恢复原始数据。
我在char缓冲区中获取二进制数据,如下所示:
有人指出了什么吗?
void readBinaryFile()
{
ifstream in("sampleFile.pdf", ios::binary);
in.seekg(0, ios::end);
int iSize = in.tellg();
in.seekg(0, ios::beg);
char* pBuff = new char[iSize];
memset(pBuff, 0, sizeof(pBuff));
in.read(pBuff, iSize);
in.close();
//some more code...
}
如果我将这个缓冲区数据写入另一个文件,它可以很好地创建一个具有相同内容的pdf文件,但我想这种char缓冲区不能正确编码或解码。
答案 0 :(得分:1)
谢谢大家。罪魁祸首是编码器 - 解码器代码。它没有正确解码。使用http://www.adp-gmbh.ch/cpp/common/base64.html一个,现在工作正常。
答案 1 :(得分:0)
你不能告诉我们问题所在。 也许使用unsigned char而不是char:
unsigned char * pBuff = new unsigned char [iSize];
问题可能是你打电话给你的编码器或解码器,而不是数据读取代码。
答案 2 :(得分:0)
问题在于:
memset(pBuff, 0, sizeof(pBuff));
由于pBuff
是char*
,sizeof(pBuff)
将返回char*
的大小,通常为4或8个字节。
你想要的是:
memset(pBuff, 0, iSize);
但正如其他人所说,没有必要将缓冲区初始化为0.您将要读取PDF文件,无论如何都可以包含嵌入的NULL,因此将缓冲区设置为0是一种浪费。< / p>
但是,为了改善代码的一小部分,你可以这样做:
#include <vector>
void readBinaryFile()
{
ifstream in("sampleFile.pdf", ios::binary);
in.seekg(0, ios::end);
int iSize = in.tellg();
in.seekg(0, ios::beg);
std::vector<char> pBuff(iSize);
if ( iSize > 0 )
in.read(&pBuff[0], iSize);
in.close();
}
现在,没有发生内存泄漏的可能性。