C / C ++二进制数据(PDF)base64编码 - 解码

时间:2015-04-20 15:31:50

标签: c++ encoding

我试图将一些二进制数据(PDF文件)转换为base64编码,然后将这些数据放入xml文件中以进行某些网络操作。

现在问题是,我相信我没有正确地将pdf文件读取(参见下面的方法)到内存缓冲区中。在读取pdf数据之后,我进入字符缓冲区并传递给编码器方法的是返回一些base64编码的字符串,但在解码时,无法恢复原始数据。

我在char缓冲区中获取二进制数据,如下所示: enter image description here

有人指出了什么吗?

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缓冲区不能正确编码或解码。

3 个答案:

答案 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));

由于pBuffchar*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();
}

现在,没有发生内存泄漏的可能性。