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
26
27
28
29
30
namespace base64 {
const char* list = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
char* get_back() {
char* tmp = new char[256];
for (int i = 0; i < 64; i++) tmp[list[i]] = i;
return tmp;
}
string encode(const string &str) {
string ret = "";
for (int p = 0; p < str.length(); p += 3) {
unsigned int tmp = ((unsigned int)((unsigned char)str[p])<<16) | ((p+1 >= str.length() ? 0 : (unsigned int)((unsigned char)str[p+1]))<<8) | (p+2 >= str.length() ? 0 : (unsigned char)str[p+2]);
ret += list[(tmp & 16515072) >> 18];
ret += list[(tmp & 258048) >> 12];
ret += str.length() - p == 1 ? '=' : list[(tmp & 4032) >> 6];
ret += str.length() - p <= 2 ? '=' : list[tmp & 63];
}
return ret;
}
string decode(const string &str) {
const char *back = get_back();
string ret = "";
for (int p = 0; p < str.length(); p += 4) {
unsigned int tmp = ((unsigned int)back[str[p]] << 18) | ((unsigned int)back[str[p+1]] << 12) | ((unsigned int)back[str[p+2]] << 6) | ((unsigned int)back[str[p+3]]);
ret += char((tmp & 16711680) >> 16);
if (str[p+1] != '=') ret += char((tmp & 65280) >> 8);
if (str[p+2] != '=') ret += char(tmp & 255);
}
return ret;
}
}