0

我正在使用此类将文本编码/解码为 base64。它适用于高达 512 的 MAX_LEN,但如果我将其增加到 1024,解码函数将返回并清空 var。

这是功能:

char* Base64::decode(char *src)
{
    unsigned six, dix;
    unsigned int d_len = MAX_LEN;

    memset(dst,'\0', MAX_LEN); 

    unsigned s_len = strlen(src);
    dix = 0;

    for (six = 0; six < s_len; six += 4)
    {
        unsigned long sr;
        unsigned ix;

        sr = 0;
        for (ix = 0; ix < 4; ++ix)
        {
            int sextet;

            if (six+ix >= s_len)
                return NULL;
            if ((sextet = tlu(*(src+six+ix))) < 0)
                break;
            sr <<= 6;
            sr |= (sextet & 0x3f);
        }

        switch (ix)
        {
            case 0: // end of data, no padding
                return 0;

            case 1: // can't happen
                return NULL;

            case 2: // 1 result byte 
                sr >>= 4;
                if (dix > d_len) return NULL;
                *(dst+dix) = (sr & 0xff);
                ++dix;
                break;
            case 3: // 2 result bytes 
                sr >>= 2;
                if (dix+1 > d_len) return NULL;
                *(dst+dix+1) = (sr & 0xff);
                sr >>= 8;
                *(dst+dix) = (sr & 0xff);
                dix += 2;
                break;
            case 4: // 3 result bytes 
                if (dix+2 > d_len) return NULL;
                *(dst+dix+2) = (sr & 0xff);
                sr >>= 8;
                *(dst+dix+1) = (sr & 0xff);
                sr >>= 8;
                *(dst+dix) = (sr & 0xff);
                dix += 3;
                break;
        }
    }

    return dst;
}

为什么会导致这种情况?

4

1 回答 1

0

奇数的dst大小不正确,无法容纳所有 1024 个字节。没有看到dst's 的声明,就无法确定。

于 2010-05-26T18:03:25.290 回答