25 std::string
base64_encode(
const void* data,
size_t size,
size_t line_break) {
26 const uint8_t* in =
reinterpret_cast<const uint8_t*
>(data);
27 const uint8_t* in_end = in + size;
30 if (size == 0)
return out;
33 size_t outsize = (((size - 1) / 3) + 1) * 4;
34 if (line_break > 0) outsize += outsize / line_break;
37 static const char encoding64[64] = {
38 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
39 'N',
'O',
'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
40 'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
41 'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z',
42 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'+',
'/'
46 size_t line_begin = 0;
56 uint8_t fragment = *in++;
57 result = (fragment & 0xFC) >> 2;
58 out += encoding64[result];
59 result =
static_cast<uint8_t
>((fragment & 0x03) << 4);
63 out += encoding64[result];
72 result |= (fragment & 0xF0) >> 4;
73 out += encoding64[result];
74 result =
static_cast<uint8_t
>((fragment & 0x0F) << 2);
78 out += encoding64[result];
86 result |= (fragment & 0xC0) >> 6;
87 out += encoding64[result];
89 result = (fragment & 0x3F) >> 0;
90 out += encoding64[result];
94 if (line_break > 0 && out.size() - line_begin >= line_break)
97 line_begin = out.size();
102 std::string
base64_encode(
const std::string& str,
size_t line_break) {
108 std::string
base64_decode(
const void* data,
size_t size,
bool strict) {
109 const uint8_t* in =
reinterpret_cast<const uint8_t*
>(data);
110 const uint8_t* in_end = in + size;
115 out.reserve(size * 3 / 4);
117 static constexpr uint8_t ex = 255;
118 static constexpr uint8_t ws = 254;
120 static const uint8_t decoding64[256] = {
121 ex, ex, ex, ex, ex, ex, ex, ex, ex, ws, ws, ex, ex, ws, ex, ex,
122 ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,
123 ws, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, 62, ex, ex, ex, 63,
124 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, ex, ex, ex, ws, ex, ex,
125 ex, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
126 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, ex, ex, ex, ex, ex,
127 ex, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
128 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, ex, ex, ex, ex, ex,
129 ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,
130 ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,
131 ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,
132 ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,
133 ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,
134 ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,
135 ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,
136 ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex
139 uint8_t outchar, fragment;
141 static const char* ex_message =
142 "Invalid character encountered during base64 decoding.";
148 if (in == in_end)
return out;
150 fragment = decoding64[*in++];
152 if (fragment == ex && strict)
153 throw std::runtime_error(ex_message);
154 }
while (fragment >= ws);
156 outchar =
static_cast<uint8_t
>((fragment & 0x3F) << 2);
160 if (in == in_end)
return out;
162 fragment = decoding64[*in++];
164 if (fragment == ex && strict)
165 throw std::runtime_error(ex_message);
166 }
while (fragment >= ws);
168 outchar =
static_cast<uint8_t
>(outchar | ((fragment & 0x30) >> 4));
169 out +=
static_cast<char>(outchar);
171 outchar =
static_cast<uint8_t
>((fragment & 0x0F) << 4);
175 if (in == in_end)
return out;
177 fragment = decoding64[*in++];
179 if (fragment == ex && strict)
180 throw std::runtime_error(ex_message);
181 }
while (fragment >= ws);
183 outchar =
static_cast<uint8_t
>(outchar | ((fragment & 0x3C) >> 2));
184 out +=
static_cast<char>(outchar);
186 outchar =
static_cast<uint8_t
>((fragment & 0x03) << 6);
190 if (in == in_end)
return out;
192 fragment = decoding64[*in++];
194 if (fragment == ex && strict)
195 throw std::runtime_error(ex_message);
196 }
while (fragment >= ws);
198 outchar =
static_cast<uint8_t
>(outchar | ((fragment & 0x3F) >> 0));
199 out +=
static_cast<char>(outchar);
203 std::string
base64_decode(
const std::string& str,
bool strict) {