C++ base64_encode function



#include <iostream>
#include <sstream>
 
using std::cout;
using std::endl;
 
std::string base64_encode(const std::string &s);
 
int main(int argc, char *argv[])
{
    cout << base64_encode("a") << endl;    //YQ==
    cout << base64_encode("ab") << endl;   //YWI=
    cout << base64_encode("abc") << endl;  //YWJj
    cout << base64_encode("abcd") << endl; //YWJjZA==
    cout << base64_encode("abcde") << endl; //YWJjZGU=
    cout << base64_encode("abcdef") << endl; //YWJjZGVm
    return 0;
}
 
std::string base64_encode(const std::string &s)
{
    static const std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    size_t i=0,ix=0,leng = s.length();
    std::stringstream q;
 
    for(i=0,ix=leng - leng%3; i<ix; i+=3)
    {
        q<< base64_chars[ (s[i] & 0xfc) >> 2 ];
        q<< base64_chars[ ((s[i] & 0x03) << 4) + ((s[i+1] & 0xf0) >> 4)  ];
        q<< base64_chars[ ((s[i+1] & 0x0f) << 2) + ((s[i+2] & 0xc0) >> 6)  ];
        q<< base64_chars[ s[i+2] & 0x3f ];
    }
    if (ix<leng)
    {
        q<< base64_chars[ (s[ix] & 0xfc) >> 2 ];
        q<< base64_chars[ ((s[ix] & 0x03) << 4) + (ix+1<leng ? (s[ix+1] & 0xf0) >> 4 : 0)];
        q<< (ix+1<leng ? base64_chars[ ((s[ix+1] & 0x0f) << 2) ] : '=');
        q<< '=';
    }
    return q.str();
}