C++ C/C++;二进制数据(PDF)base64编码-解码
我正在尝试将一些二进制数据(PDF文件)转换为base64编码,然后将这些数据放入xml文件中,以便进行一些网络操作 现在的问题是,我认为我没有正确地将pdf文件读入内存缓冲区(请参阅下面的方法)。在读取pdf数据后,我进入字符缓冲区并传递给编码器方法的是返回一些base64编码的字符串,但在解码时,无法恢复原始数据 我在char缓冲区中获取二进制数据,如下所示: 有人给我指点什么吗C++ C/C++;二进制数据(PDF)base64编码-解码,c++,encoding,C++,Encoding,我正在尝试将一些二进制数据(PDF文件)转换为base64编码,然后将这些数据放入xml文件中,以便进行一些网络操作 现在的问题是,我认为我没有正确地将pdf文件读入内存缓冲区(请参阅下面的方法)。在读取pdf数据后,我进入字符缓冲区并传递给编码器方法的是返回一些base64编码的字符串,但在解码时,无法恢复原始数据 我在char缓冲区中获取二进制数据,如下所示: 有人给我指点什么吗 void readBinaryFile() { ifstream in("sampleFile.pdf",
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设计用于对可能具有控制字符和嵌入空值的数据进行编码。所以我不明白你的问题到底是什么。这不是原始代码中的问题。正如我在回答中所假设的那样,必须在编码器/解码器代码中搜索问题,这在问题中没有显示。过了一会儿,问题就出在编码器/解码器上了。