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

C++ C/C++;二进制数据(PDF)base64编码-解码,c++,encoding,C++,Encoding,我正在尝试将一些二进制数据(PDF文件)转换为base64编码,然后将这些数据放入xml文件中,以便进行一些网络操作 现在的问题是,我认为我没有正确地将pdf文件读入内存缓冲区(请参阅下面的方法)。在读取pdf数据后,我进入字符缓冲区并传递给编码器方法的是返回一些base64编码的字符串,但在解码时,无法恢复原始数据 我在char缓冲区中获取二进制数据,如下所示: 有人给我指点什么吗 void readBinaryFile() { ifstream in("sampleFile.pdf",

我正在尝试将一些二进制数据(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文件就可以了,但我想这种字符缓冲区无法正确编码或解码

你没有告诉我们问题出在哪里。 可能使用无符号字符而不是字符:

unsigned char * pBuff = new unsigned char [iSize];
  • 检查分配是否正常
可能问题在于调用编码器或解码器时,而不是在数据读取代码中

问题在于:

memset(pBuff, 0, sizeof(pBuff));
由于
pBuff
是一个
char*
,因此
sizeof(pBuff)
将返回一个
char*
的大小,通常是4或8个字节

你想要的是:

memset(pBuff, 0, iSize);
但正如其他人所说,不需要将缓冲区初始化为0。您将要读取一个PDF文件,该文件可能包含嵌入的空值,因此将缓冲区设置为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();
}
#包括
void readBinaryFile()
{
ifstream-in(“sampleFile.pdf”,ios::binary);
in.seekg(0,ios::end);
int iSize=in.tellg();
in.seekg(0,ios::beg);
std::载体pBuff(iSize);
如果(iSize>0)
in.read(&pBuff[0],iSize);
in.close();
}

现在,不会发生内存泄漏。

谢谢大家。罪魁祸首是编码解码器。它没有正确解码。用过一个,现在可以用了

为什么要将缓冲区全部设置为0?这是一个浪费的工作。这是为了初始化。这有什么不对?您的
读取将覆盖您的数据,因此初始化是徒劳的。这在大型缓冲区上会很明显。是什么让您认为问题出在文件读取代码上?我没有看到任何明显的错误,除了
sizeof(pBuff)
错误,只要文件长度至少为8字节,该错误是无害的。std::read不允许读入未签名字符缓冲区。我尝试使用未签名的MFC文件。但是没有用。你能写下用于执行编码/解码操作的伪代码吗?这些函数是来自标准库还是您自己的?是的,这是我在代码中更正的一点,但请参见我的主要帖子(编辑)图像。它将二进制数据存储在char缓冲区中,这会导致编解码问题。是的,你是对的,但在读取之前,这会在缓冲区中戳出4个零,因此不会出现语义错误there@PLearner您正在尝试将该流编码为Base64吗?如果是这样的话,那条流没有什么问题。Base64设计用于对可能具有控制字符和嵌入空值的数据进行编码。所以我不明白你的问题到底是什么。这不是原始代码中的问题。正如我在回答中所假设的那样,必须在编码器/解码器代码中搜索问题,这在问题中没有显示。过了一会儿,问题就出在编码器/解码器上了。