用c ++解码base64中编码的大量数据

时间:2018-05-07 22:01:47

标签: c++ base64

我有一个在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正确发生?数据的输入和输出必须是字符串类型。

2 个答案:

答案 0 :(得分:2)

问题可能在于如何构造返回字符串/container/[cid]/widgets/[wid]。您一次添加一个字符,因此字符串将定期增加容量。由于分配的块的大小以及堆的工作方式,这将留下大量未分配但仍使用的堆空间。

由于您可以计算返回字符串所需的大小,因此可以使用

ret

ret.reserve((in_len * 3 + 3) / 4); 循环之前为整个字符串分配一个足够大的缓冲区。这将避免所有额外的内存分配,并应允许您解码大字符串。

答案 1 :(得分:0)

当您使用自定义设备时,可能您尝试存储的内容超过常见字符串可以存储的内容。字符串具有最大大小(you can see here how to check)。你应该检查它是否适合你的用例,如果没有,可以使用缓冲区。如果尺寸合适,则需要更多信息。