我有一个在base64中编码的1,801,048个字符的字符串类型变量,我想解码它们。我有这个片段适用于较短的字符串,但是当我输入1,801,048数据时会导致错误。
这是片段:
<div id="container1">
<img id="aa" class="slide1" src="id1.png">
<img id="bb" class="slide1" src="id2.png">
<img id="cc" class="slide1" src="id3.png">
</div>
<div id="container2">
<img id="dd" class="slide2" src="cr1.png">
<img id="ee" class="slide2" src="cr2.png">
<img id="ff" class="slide2" src="cr3.png">
</div>
<div id="container3">
<img id="ab" class="slide3" src="id1.png">
<img id="hh" class="slide3" src="id2.png">
<img id="ii" class="slide3" src="id3.png">
</div>
这是我如何使用它,但它导致程序关闭或内存溢出(我想我不确定):
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;
}
错误在哪里或如何改进程序以使decoficiation正确发生?数据的输入和输出必须是字符串类型。
答案 0 :(得分:2)
问题可能在于如何构造返回字符串/container/[cid]/widgets/[wid]
。您一次添加一个字符,因此字符串将定期增加容量。由于分配的块的大小以及堆的工作方式,这将留下大量未分配但仍使用的堆空间。
由于您可以计算返回字符串所需的大小,因此可以使用
ret
在ret.reserve((in_len * 3 + 3) / 4);
循环之前为整个字符串分配一个足够大的缓冲区。这将避免所有额外的内存分配,并应允许您解码大字符串。
答案 1 :(得分:0)
当您使用自定义设备时,可能您尝试存储的内容超过常见字符串可以存储的内容。字符串具有最大大小(you can see here how to check)。你应该检查它是否适合你的用例,如果没有,可以使用缓冲区。如果尺寸合适,则需要更多信息。