42 #ifndef SUPPORTLIB_BASE64_H
43 #define SUPPORTLIB_BASE64_H
60 inline std::string
Encode(
const std::vector<char>& data) {
61 static constexpr
char sEncodingTable[] = {
62 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
63 'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
64 'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
65 'Y',
'Z',
'a',
'b',
'c',
'd',
'e',
'f',
66 'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
67 'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
68 'w',
'x',
'y',
'z',
'0',
'1',
'2',
'3',
69 '4',
'5',
'6',
'7',
'8',
'9',
'+',
'/'
72 size_t in_len = data.size();
73 size_t out_len = 4 * ((in_len + 2) / 3);
74 std::string ret(out_len,
'\0');
76 char *p =
const_cast<char*
>(ret.c_str());
78 for (i = 0; i < in_len - 2; i += 3) {
79 *p++ = sEncodingTable[(data[i] >> 2) & 0x3F];
80 *p++ = sEncodingTable[((data[i] & 0x3) << 4) | ((int) (data[i + 1] & 0xF0) >> 4)];
81 *p++ = sEncodingTable[((data[i + 1] & 0xF) << 2) | ((int) (data[i + 2] & 0xC0) >> 6)];
82 *p++ = sEncodingTable[data[i + 2] & 0x3F];
85 *p++ = sEncodingTable[(data[i] >> 2) & 0x3F];
86 if (i == (in_len - 1)) {
87 *p++ = sEncodingTable[((data[i] & 0x3) << 4)];
91 *p++ = sEncodingTable[((data[i] & 0x3) << 4) | ((int) (data[i + 1] & 0xF0) >> 4)];
92 *p++ = sEncodingTable[((data[i + 1] & 0xF) << 2)];
104 inline std::vector<char>
Decode(
const std::string& base64Data) {
105 static constexpr
unsigned char kDecodingTable[] = {
106 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
107 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
108 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
109 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
110 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
111 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
112 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
113 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
114 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
115 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
116 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
117 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
118 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
119 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
120 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
121 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
124 size_t in_len = base64Data.size();
125 if (in_len % 4 != 0)
return {};
127 size_t out_len = in_len / 4 * 3;
128 if (base64Data[in_len - 1] ==
'=') out_len--;
129 if (base64Data[in_len - 2] ==
'=') out_len--;
131 std::vector<char> out(out_len);
133 for (
size_t i = 0, j = 0; i < in_len;) {
134 uint32_t a = base64Data[i] ==
'=' ? 0 & i++ : kDecodingTable[
static_cast<int>(base64Data[i++])];
135 uint32_t b = base64Data[i] ==
'=' ? 0 & i++ : kDecodingTable[
static_cast<int>(base64Data[i++])];
136 uint32_t c = base64Data[i] ==
'=' ? 0 & i++ : kDecodingTable[
static_cast<int>(base64Data[i++])];
137 uint32_t d = base64Data[i] ==
'=' ? 0 & i++ : kDecodingTable[
static_cast<int>(base64Data[i++])];
138 uint32_t triple = (a << 3 * 6) + (b << 2 * 6) + (c << 1 * 6) + (d << 0 * 6);
139 if (j < out_len) out[j++] = (triple >> 2 * 8) & 0xFF;
140 if (j < out_len) out[j++] = (triple >> 1 * 8) & 0xFF;
141 if (j < out_len) out[j++] = (triple >> 0 * 8) & 0xFF;
std::vector< char > Decode(const std::string &base64Data)
Definition: Base64.h:104
std::string Encode(const std::vector< char > &data)
Definition: Base64.h:60
Namespace for giri's C++ support library.
Definition: Base64.h:47