C++ 在c+中解码base64中编码的大量数据+;
我有一个用base64编码的1801048个字符的字符串类型变量,我想对它们进行解码。我有一段代码,它可以很好地处理较短的字符串,但是当我放入1801048数据时,它会导致错误 以下是代码片段:C++ 在c+中解码base64中编码的大量数据+;,c++,base64,C++,Base64,我有一个用base64编码的1801048个字符的字符串类型变量,我想对它们进行解码。我有一段代码,它可以很好地处理较短的字符串,但是当我放入1801048数据时,它会导致错误 以下是代码片段: static inline bool is_base64(unsigned char c) { return (isalnum(c) || (c == '+') || (c == '/')); } string base64_decode(string const& encoded_
static inline bool is_base64(unsigned char c)
{
return (isalnum(c) || (c == '+') || (c == '/'));
}
string base64_decode(string const& encoded_string)
{
int in_len = encoded_string.size();
int i = 0;
int j = 0;
int in_ = 0;
unsigned char char_array_4[4], char_array_3[3];
string ret;
while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_]))
{
char_array_4[i++] = encoded_string[in_]; in_++;
if (i ==4)
{
for (i = 0; i < 4; i++)
{
char_array_4[i] = base64_chars.find(char_array_4[i]);
}
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
for (i = 0; (i < 3); i++)
{
ret += char_array_3[i];
}
i = 0;
}
}
if (i)
{
for (j = i; j < 4; j++)
{
char_array_4[j] = 0;
}
for (j = 0; j < 4; j++)
{
char_array_4[j] = base64_chars.find(char_array_4[j]);
}
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
for (j = 0; (j < i - 1); j++)
{
ret += char_array_3[j];
}
}
return ret;
}
错误在哪里?我如何改进程序,以便正确地进行消隐?数据的输入和输出必须是字符串类型。当您使用自定义设备时,可能您试图存储的数据多于普通字符串可以存储的数据。字符串具有最大大小()。您应该检查它是否适合您的用例,如果不适合,可以使用缓冲区。如果大小合适,则需要更多信息。问题可能在于如何构造返回字符串
ret
。您一次添加一个字符,因此字符串的容量将定期增长。由于分配的块的大小以及堆的工作方式,这将留下大量未分配但仍在使用的堆空间
由于可以计算返回字符串所需的大小,因此可以使用
ret.reserve((in_len * 3 + 3) / 4);
在
while
循环之前,为整个字符串分配一个足够大的缓冲区。这将避免所有额外的内存分配,并允许您解码大字符串。错误消息是什么?你能在调试模式下运行它吗?@CaptainGiraffe我看不到错误,因为我在一个电子设备(POS)上运行程序,并且它没有debbug模式。这就是为什么我认为它有内存溢出的原因。设备的功能可能非常重要,应该包括在这个问题中。我建议您使用这些信息对其进行编辑。任何将失败字符串导出到文件的方法都可以在更友好的调试环境下运行代码?因为源encoded\u string
参数是string
,并且将比解码字符串包含更多字符,所以这不是问题所在。
ret.reserve((in_len * 3 + 3) / 4);