+string TextParser::base64_decode(const string &data)
+{
+ string bin;
+ bin.reserve(data.size()*3/4);
+ unsigned accum = 0;
+ unsigned a_bits = 0;
+ for(char c: data)
+ {
+ unsigned d;
+ if(c>='A' && c<='Z')
+ d = c-'A';
+ else if(c>='a' && c<='z')
+ d = 26+(c-'a');
+ else if(c>='0' && c<='9')
+ d = 52+(c-'0');
+ else if(c=='+')
+ d = 62;
+ else if(c=='/')
+ d = 63;
+ else if(c=='=')
+ continue;
+ else
+ throw invalid_argument("TextParser::base64_decode");
+
+ accum = (accum<<6)|d;
+ a_bits += 6;
+
+ if(a_bits>=8)
+ {
+ bin += (accum>>(a_bits-8))&0xFF;
+ a_bits -= 8;
+ }
+ }
+
+ return bin;
+}
+