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)