【问题标题】:C/C++ binary data (PDF) base64 encode-decodeC/C++ 二进制数据 (PDF) base64 编码-解码
【发布时间】:2015-06-27 10:20:49
【问题描述】:

我正在尝试将一些二进制数据(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?这是白费力气。
  • 那是初始化。这有什么问题?
  • 您的read 将覆盖您的数据,因此初始化是白费力气。这在大缓冲区上会很明显。
  • 是什么让你认为问题出在文件读取代码中?我没有看到任何明显错误,除了 sizeof(pBuff) 错误,只要文件至少有 8 个字节长,它就无害。

标签: c++ encoding


【解决方案1】:

你没有告诉我们问题是什么。 也许使用 unsigned char 而不是 char:

unsigned char * pBuff = new unsigned char [iSize];
  • 检查分配是否正常

问题可能出在您调用编码器或解码器时,而不是在数据读取代码中。

【讨论】:

  • 好吧。 std::read 不允许读取无符号字符缓冲区。我尝试使用未签名的 MFC CFile。但是没用。
  • 你能写出用于执行编码/解码操作的伪代码吗?这些函数来自标准库还是您自己的?
【解决方案2】:

问题是这样的:

memset(pBuff, 0, sizeof(pBuff));

由于pBuffchar*sizeof(pBuff) 将返回char* 的大小,通常为 4 或 8 个字节。

你想要的是:

memset(pBuff, 0, iSize);

但正如其他人所说,没有必要将缓冲区初始化为 0。您将阅读一个 PDF 文件,它可能包含嵌入的 NULL,因此将缓冲区设置为 0 是一种浪费。

但是,为了改进一点代码,您可以这样做:

#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();
}

现在,不可能发生内存泄漏。

【讨论】:

  • 是的,这是我在代码中更正的一点,但请参阅我的主要帖子(已编辑)图像。它将二进制数据存储在 char 缓冲区中,就像导致编码 - 解码问题一样。
  • 是的,你是对的,但是这会在读取之前在缓冲区中戳 4 个零,所以没有语义错误
  • @PLearner 您是否尝试将该流编码到 Base64?如果是这样,则该流没有任何问题。 Base64 旨在对可能具有控制字符和嵌入空值的数据进行编码。所以我看不出你的问题到底是什么。
  • 这不是原始代码中的问题。正如我在回答中所想的那样,必须在编码器/解码器代码中搜索该问题,而该问题未在问题中显示。而且,过了一会儿,问题就出在编码器/解码器上。
【解决方案3】:

谢谢大家。罪魁祸首是编码器-解码器代码。它没有正确解码。使用http://www.adp-gmbh.ch/cpp/common/base64.html 之一,现在工作正常。

【讨论】:

    猜你喜欢
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2017-07-14
    • 2017-10-13
    • 2023-03-16
    • 1970-01-01
    • 2018-05-18
    相关资源
    最近更新 更多