C++ base64_decode function
#include <iostream>
#include <sstream>
using std::cout;
using std::endl;
std::string base64_decode(const std::string &s);
int main(int argc, char *argv[])
{
cout << base64_decode( "YQ==" ) << endl;
cout << base64_decode( "YWI=" ) << endl;
cout << base64_decode( "YWJj" ) << endl;
cout << base64_decode( "YWJjZA==" ) << endl;
cout << base64_decode( "YWJjZGU=" ) << endl;
cout << base64_decode( "YWJjZGVm" ) << endl;
return 0;
}
std::string base64_decode(const std::string &s)
{
static unsigned char base64_reverse[] = {-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,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-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,-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};
size_t i=0,ix=0,leng = s.length();
std::stringstream q;
if ((leng%4)==0)
{
leng = s[leng-1]=='=' ? leng-1 : leng;
leng = s[leng-1]=='=' ? leng-1 : leng;
for(i=0,ix=leng-(leng%4); i<ix; i+=4)
{
q<< (char)((base64_reverse[ s[i] ] << 2) + ((base64_reverse[ s[i+1] ] & 0x30) >> 4));
q<< (char)(((base64_reverse[ s[i+1] ] & 0xf) << 4) + ((base64_reverse[ s[i+2] ] & 0x3c) >> 2));
q<< (char)(((base64_reverse[ s[i+2] ] & 0x3) << 6) + base64_reverse[ s[i+3] ]);
}
if (ix<leng)
{
q<< (char)( (base64_reverse[ s[ix] ] << 2) + (ix+1<leng ? (base64_reverse[ s[ix+1] ] & 0x30) >> 4 : 0) );
q<< (char)( ix+1<leng ? ((base64_reverse[ s[ix+1] ] & 0xf) << 4) + (ix+2<leng ? (base64_reverse[ s[ix+2] ] & 0x3c) >> 2 :0 ) : '\0' );
q<< (char)( ix+2<leng ? (base64_reverse[ s[ix+2] ] & 0x3) << 6 : '\0' );
}
}
return q.str();
}code snippets are licensed under Creative Commons CC-By-SA 3.0 (unless otherwise specified)
|