39 template<
class _Elem,
class _Traits,
class _Ax>
40 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)
42 assert(data || !size);
45 out.reserve(out.size() +
enc_size(size));
48 for (
size_t i = 0;; i++) {
57 buf[
num++] =
reinterpret_cast<const unsigned char*
>(data)[i];
86 return ((
num + size + 2)/3)*4;
94 template<
class _Elem,
class _Traits,
class _Ax>
95 void encode(_Inout_ std::basic_string<_Elem, _Traits, _Ax> &out)
97 out += base64_enc_lookup[
buf[0] >> 2 ];
98 out += base64_enc_lookup[((
buf[0] << 4) | (
buf[1] >> 4)) & 0x3f];
99 out += base64_enc_lookup[((
buf[1] << 2) | (
buf[2] >> 6)) & 0x3f];
100 out += base64_enc_lookup[
buf[2] & 0x3f];
107 template<
class _Elem,
class _Traits,
class _Ax>
108 void encode(_Inout_ std::basic_string<_Elem, _Traits, _Ax> &out, _In_
size_t size)
111 out += base64_enc_lookup[
buf[0] >> 2];
113 out += base64_enc_lookup[((
buf[0] << 4) | (
buf[1] >> 4)) & 0x3f];
115 out += base64_enc_lookup[((
buf[1] << 2) | (
buf[2] >> 6)) & 0x3f];
116 out += base64_enc_lookup[
buf[2] & 0x3f];
118 out += base64_enc_lookup[(
buf[1] << 2) & 0x3f];
122 out += base64_enc_lookup[(
buf[0] << 4) & 0x3f];
142 static const char base64_enc_lookup[64] = {
143 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
144 'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
'a',
'b',
'c',
'd',
'e',
'f',
145 'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
146 'w',
'x',
'y',
'z',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'+',
'/'
177 template<
class _Ty,
class _Ax,
class _Tchr>
178 void decode(_Inout_ std::vector<_Ty, _Ax> &out, _Out_
bool &is_last, _In_z_count_(size)
const _Tchr *data, _In_
size_t size)
183 for (
size_t k = 0; k < size; k++)
184 if (!data[k]) { size = k;
break; }
187 out.reserve(out.size() +
dec_size(size));
189 for (
size_t i = 0;; i++) {
192 size_t nibbles =
decode(out);
204 if ((
buf[
num] = x < _countof(base64_dec_lookup) ? base64_dec_lookup[x] : 255) != 255)
228 return ((
num + size + 3)/4)*3;
236 template<
class _Ty,
class _Ax>
237 size_t decode(_Inout_ std::vector<_Ty, _Ax> &out)
239 out.push_back((_Ty)(((
buf[0] << 2) | (
buf[1] >> 4)) & 0xff));
241 out.push_back((_Ty)(((
buf[1] << 4) | (
buf[2] >> 2)) & 0xff));
243 out.push_back((_Ty)(((
buf[2] << 6) |
buf[3]) & 0xff));
259 static const unsigned char base64_dec_lookup[256] = {
261 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
262 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
263 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
264 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 64, 255, 255,
265 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
266 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255,
267 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
268 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255,
269 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
270 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 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
Base64 decoding session.
Definition: base64.h:155
size_t num
Number of bytes used in buf
Definition: base64.h:254
base64_dec() noexcept
Constructs blank decoding session.
Definition: base64.h:160
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:178
size_t dec_size(size_t size) const noexcept
Returns maximum decoded size.
Definition: base64.h:226
size_t decode(std::vector< _Ty, _Ax > &out)
Decodes one complete internal buffer of data.
Definition: base64.h:237
void clear() noexcept
Resets decoding session.
Definition: base64.h:213
unsigned char buf[4]
Internal buffer.
Definition: base64.h:253
Base64 encoding session.
Definition: base64.h:18
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:40
unsigned char buf[3]
Internal buffer.
Definition: base64.h:136
void encode(std::basic_string< _Elem, _Traits, _Ax > &out)
Encodes one complete internal buffer of data.
Definition: base64.h:95
size_t num
Number of bytes used in buf
Definition: base64.h:137
void encode(std::basic_string< _Elem, _Traits, _Ax > &out, size_t size)
Encodes partial internal buffer of data.
Definition: base64.h:108
base64_enc() noexcept
Constructs blank encoding session.
Definition: base64.h:23
void clear() noexcept
Resets encoding session.
Definition: base64.h:71
size_t enc_size(size_t size) const noexcept
Returns maximum encoded size.
Definition: base64.h:84