0

I have decode a Base64 string and finally out a jpg image.

When I try to decode Base64 string with Base64 decode function which I found here I get an empty string .

Here is my code:

std::string decodedString, encodedString;

"encodedString is base64 string below."

decodedString =  base64_decode(encodedString);

and its base64_decode function:

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;
}

its my 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

Image is just A7 I've checked in a few web sites and it works fine. And also this code block works in a different project perfectly fine.

By the way I'm using Clion 2017.3, Ubuntu 16.04, CXX_STANDARD 11

SiGe
  • 341
  • 6
  • 18
Marijke Buurlage
  • 331
  • 5
  • 21
  • It is not a good idea to use `std::string` for binary buffer, I would use `std::vector` instead (or unsigned char). I bet that string is not empty. – Slava Dec 14 '17 at 14:37
  • @Slava source was also string. And i have also debugged in the decoder function. while return "ret" value is always null. i mean yeah std::string for binary buffer may be wrong idea but problem is not this i think. – Marijke Buurlage Dec 14 '17 at 14:51
  • What do you mean "value is always nul"? This string would have binary data, that can include 0 byte and output that to `std::cout` for example would show nothing. That's why I said it is not a good idea. What `ret.length()` gives you? – Slava Dec 14 '17 at 15:00
  • This is a rather contrived version of the thing. What's the need for 7 bytes of buffer when a uint16_t has enough capacity to hold over 2 symbols? – Michaël Roy Dec 14 '17 at 16:15

2 Answers2

0

The algorithm you picked is terribly slow. Too many array accesses (this puts values the stack, instead of in registers), too many shifts and logical ops per byte.

Here is the main loop of a much simpler and efficient algorithm. Note that the output is not a string, since binary data can be encoded as well.

Being able to specify a custom encoding table is also important. That technique is often used to further obfuscate license keys and encryption related tasks.

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;
}

The other dependencies:

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);
}

I know this is not a direct answer to your question, but I felt I had to say something. The algorithm you picked is one the worst I've seen. I don't think it is worth spending much time on it, especially if it gives you trouble.

Michaël Roy
  • 6,338
  • 1
  • 15
  • 19
0

That was so annoying problem. I've tried so many algorithms and i've changed my code in so many ways.

If anyone wonders, here is my solution. my encodedString string had special-characters. (/n /r /t) Thats why i've just added some code before decoding code:

        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());

After that decoder worked just fine.

Marijke Buurlage
  • 331
  • 5
  • 21