C++ base64_decode() return null

C++ base64_decode() return null

本文关键字:return null decode base64 C++      更新时间:2023-10-16

我已经解码了一个base64字符串,最后是jpg image。

尝试用base64解码函数解码base64字符串时,我在这里发现了一个空字符串。

这是我的代码:

std::string decodedString, encodedString;

"编码串是下面的base64字符串。"

decodedString =  base64_decode(encodedString);

及其base64_decode函数:

static const std::string base64_chars = 
             "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
             "abcdefghijklmnopqrstuvwxyz"
             "0123456789+/";

static inline bool is_base64(unsigned char c) {
  return (isalnum(c) || (c == '+') || (c == '/'));
}
std::string base64_decode(std::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];
  std::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;
}

它是我的base64:

/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAIOAcADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoorz79qv9p7wh+xj+z14q+J/jy+l0/wn4PtPtl/NFH5spBdY0jjTI3O8joirkZZgKAPQaK/Lb/iMC/Y7/wCfz4lf+Ez/APba9g/YX/4OJv2bf+Chn7RGnfC7wBqniqLxZq9t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/wAITS//AIxR/wAOyP2bf+je/gf/AOEJpf8A8Yr3CigD8G/+Duf/AIJSeBfh5+yf4L+Mvwr+H/hLwUvgrVjpPiWDw5otvpsNzZ3u1YLiZYUVWMVwiRgkZ/0vHQDH889f3Y/tlfszaP8Atl/sqfED4Wa6EXTfHWh3OlNKy7vskrofJnA/vRShJF/2kFfw1fE74c6x8HviT4g8JeIbR7DXvC+pXGk6lbN963uYJWilQ/R0YfhQB/TF/wAGdf7dP/C+f2D9c+D2r3nm6/8ABvUf9BWRsvJpF6zyw4zy3lzi5Q44VTCOMiv1+r+On/g3U/bp/wCGD/8Agqf4B1bULz7J4T8cyf8ACHeICzbY1t7x0WKVj0CxXK28hbsiOO9f2LUAfyI/8HTXxok+MH/BaX4mW4lMtl4LtdM8OWnOdqxWcU0q+2LieeuF/wCDdv4Mx/HP/gs78B9KnhEtvpWuSeIZCRlYzp1tNfRsf+2sEYHuRXnH/BYHxXJ40/4KsftHX8jF/wDi5GvWyE944b+aFP8Ax2Na+xP+DPHwzFr3/BX8XUihn0XwRq17GT/CzPbQZ/75mb86AP6q6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/Z

图像只是 a7 我在几个网站上检查了,它可以正常工作。而且,此代码块在另一个不同的项目中起作用。

顺便说一句,我正在使用Clion 2017.3,Ubuntu 16.04,CXX_STANDARD 11

您选择的算法非常慢。太多的数组访问(这使堆栈是值,而不是在寄存器中),每个字节的偏移和逻辑操作。

这是一种更简单,更有效的算法的主要循环。请注意,输出不是字符串,因为二进制数据也可以编码。

能够指定自定义编码表也很重要。该技术通常用于进一步混淆许可键和与加密相关的任务。

size_t Base64Decode(const std::string& strSrc, void* pvDest, size_t nBytesMax, const char* szEncodingChars)
{
    size_t nBytesOut = ((strSrc.length() * 6) + 7) / 8;
    BYTE* pchOut = reinterpret_cast<BYTE*>(pvDest);
    if (nBytesOut > nBytesMax)
        return 0;
    size_t nBytesIn = strSrc.length();
    try
    {
        WORD w      = 0;  // work buffer
        UINT nShift = 0;  // shift left needed to align new glyph into buffer w
        for (size_t i = 0; i < strSrc.length(); ++i, nShift += 6)
        {
            if (!szEncodingChars)
            {
                w |= (CharToNibble(strSrc[i]) << nShift);
            }
            else
            {
                const char* p = strchr(szEncodingChars, strSrc[i]);
                if (!p)
                    throw std::exception("Not Base64");
                w |= ((p - szEncodingChars) << nShift);
            }
            if ((nShift + 6) >= 8)
            {
                *pchOut++ = LOBYTE(w);
                nBytesOut--;
                w >>= 8;
                nShift -= 8;
            }
        }
        if (nBytesOut)
            *pchOut++ = LOBYTE(w);
    }
    catch (std::exception&)
    {
        return 0;
    }
    return ((strSrc.length() * 6) + 7) / 8;
}

其他依赖性:

static const char kaDecodeLUT[256] = 
{
    -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1, 
    -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1, 
    -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, 62,  -1, -1, -1, 63, 
    52, 53, 54, 55,  56, 57, 58, 59,  60, 61, -1, -1,  -1, -1, -1, -1,  // 0-9
    -1,  0,  1,  2,   3,  4,  5,  6,   7,  8,  9, 10,  11, 12, 13, 14,  // A-O
    15, 16, 17, 18,  19, 20, 21, 22,  23, 24, 25, -1,  -1, -1, -1, -1,  // P-Z
    -1, 26, 27, 28,  29, 30, 31, 32,  33, 34, 35, 36,  37, 38, 39, 40,  // a-o
    41, 42, 43, 44,  45, 46, 47, 48,  49, 50, 51, -1,  -1, -1, -1, -1,  // p-z
    -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1, 
    -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1, 
    -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1, 
    -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1, 
    -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1, 
    -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1,  -1, -1, -1, -1, 
};
static BYTE CharToNibble(char ch)
{
    char n = kaDecodeLUT[static_cast<BYTE>(ch)];
    if (n < 0)
        throw std::exception("Not Base64");
    return static_cast<BYTE>(n);
}

我知道这不是您问题的直接答案,但是我觉得我不得不说些什么。您选择的算法是我见过的最糟糕的算法。我认为这不值得花很多时间,尤其是如果它给您麻烦。

这是如此令人讨厌的问题。我尝试了很多算法,并且以多种方式更改了代码。

如果有人想知道,这是我的解决方案。我的编码弦字符串具有特殊字符。(/n/r/t)这就是为什么我刚刚在解码代码之前添加了一些代码:

        encoded.erase(std::remove(encoded.begin(), encoded.end(), 'n'), encoded.end());
        encoded.erase(std::remove(encoded.begin(), encoded.end(), 'r'), encoded.end());
        encoded.erase(std::remove(encoded.begin(), encoded.end(), 't'), encoded.end());

之后,解码器工作正常。