41 template<
class _Elem,
class _Traits,
class _Ax>
42 void encode(_Inout_ std::basic_string<_Elem, _Traits, _Ax> &out, _In_bytecount_(size)
const void *data, _In_
size_t size, _In_opt_
bool is_last =
true)
44 assert(data || !size);
47 out.reserve(out.size() +
enc_size(size));
50 for (
size_t i = 0;; i++) {
59 buf[
num++] =
reinterpret_cast<const uint8_t*
>(data)[i];
86 size_t enc_size(_In_
size_t size)
const noexcept
88 return ((
num + size + 2)/3)*4;
96 template<
class _Elem,
class _Traits,
class _Ax>
97 void encode(_Inout_ std::basic_string<_Elem, _Traits, _Ax> &out)
99 out += base64_enc_lookup[
buf[0] >> 2 ];
100 out += base64_enc_lookup[((
buf[0] << 4) | (
buf[1] >> 4)) & 0x3f];
101 out += base64_enc_lookup[((
buf[1] << 2) | (
buf[2] >> 6)) & 0x3f];
102 out += base64_enc_lookup[
buf[2] & 0x3f];
109 template<
class _Elem,
class _Traits,
class _Ax>
110 void encode(_Inout_ std::basic_string<_Elem, _Traits, _Ax> &out, _In_
size_t size)
113 out += base64_enc_lookup[
buf[0] >> 2];
115 out += base64_enc_lookup[((
buf[0] << 4) | (
buf[1] >> 4)) & 0x3f];
117 out += base64_enc_lookup[((
buf[1] << 2) | (
buf[2] >> 6)) & 0x3f];
118 out += base64_enc_lookup[
buf[2] & 0x3f];
120 out += base64_enc_lookup[(
buf[1] << 2) & 0x3f];
124 out += base64_enc_lookup[(
buf[0] << 4) & 0x3f];
144 static const char base64_enc_lookup[64] = {
145 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
146 'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
'a',
'b',
'c',
'd',
'e',
'f',
147 'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
148 'w',
'x',
'y',
'z',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'+',
'/'
179 template<
class _Ty,
class _Ax,
class _Tchr>
180 void decode(_Inout_ std::vector<_Ty, _Ax> &out, _Out_
bool &is_last, _In_z_count_(size)
const _Tchr *data, _In_
size_t size)
185 for (
size_t k = 0; k < size; k++)
186 if (!data[k]) { size = k;
break; }
189 out.reserve(out.size() +
dec_size(size));
191 for (
size_t i = 0;; i++) {
194 size_t nibbles =
decode(out);
206 if ((
buf[
num] = x < _countof(base64_dec_lookup) ? base64_dec_lookup[x] : 255) != 255)
230 return ((
num + size + 3)/4)*3;
238 template<
class _Ty,
class _Ax>
239 size_t decode(_Inout_ std::vector<_Ty, _Ax> &out)
241 out.push_back((_Ty)(((
buf[0] << 2) | (
buf[1] >> 4)) & 0xff));
243 out.push_back((_Ty)(((
buf[1] << 4) | (
buf[2] >> 2)) & 0xff));
245 out.push_back((_Ty)(((
buf[2] << 6) |
buf[3]) & 0xff));
261 static const uint8_t base64_dec_lookup[256] = {
263 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
264 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
265 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
266 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 64, 255, 255,
267 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
268 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255,
269 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
270 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255,
271 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
272 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
273 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
274 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
275 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
276 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
277 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
278 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
Base64 decoding session.
Definition: base64.h:157
size_t num
Number of bytes used in buf
Definition: base64.h:256
base64_dec() noexcept
Constructs blank decoding session.
Definition: base64.h:162
void decode(std::vector< _Ty, _Ax > &out, bool &is_last, const _Tchr *data, size_t size)
Decodes one block of information, and appends it to the output.
Definition: base64.h:180
size_t dec_size(size_t size) const noexcept
Returns maximum decoded size.
Definition: base64.h:228
uint8_t buf[4]
Internal buffer.
Definition: base64.h:255
size_t decode(std::vector< _Ty, _Ax > &out)
Decodes one complete internal buffer of data.
Definition: base64.h:239
void clear() noexcept
Resets decoding session.
Definition: base64.h:215
Base64 encoding session.
Definition: base64.h:20
void encode(std::basic_string< _Elem, _Traits, _Ax > &out, const void *data, size_t size, bool is_last=true)
Encodes one block of information, and appends it to the output.
Definition: base64.h:42
void encode(std::basic_string< _Elem, _Traits, _Ax > &out)
Encodes one complete internal buffer of data.
Definition: base64.h:97
size_t num
Number of bytes used in buf
Definition: base64.h:139
void encode(std::basic_string< _Elem, _Traits, _Ax > &out, size_t size)
Encodes partial internal buffer of data.
Definition: base64.h:110
base64_enc() noexcept
Constructs blank encoding session.
Definition: base64.h:25
uint8_t buf[3]
Internal buffer.
Definition: base64.h:138
void clear() noexcept
Resets encoding session.
Definition: base64.h:73
size_t enc_size(size_t size) const noexcept
Returns maximum encoded size.
Definition: base64.h:86