40 template<
class _Elem,
class _Traits,
class _Ax>
41 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)
43 assert(data || !size);
46 out.reserve(out.size() +
enc_size(size));
49 for (
size_t i = 0;; i++) {
58 buf[
num++] =
reinterpret_cast<const unsigned char*
>(data)[i];
85 size_t enc_size(_In_
size_t size)
const noexcept
87 return ((
num + size + 2)/3)*4;
95 template<
class _Elem,
class _Traits,
class _Ax>
96 void encode(_Inout_ std::basic_string<_Elem, _Traits, _Ax> &out)
98 out += base64_enc_lookup[
buf[0] >> 2 ];
99 out += base64_enc_lookup[((
buf[0] << 4) | (
buf[1] >> 4)) & 0x3f];
100 out += base64_enc_lookup[((
buf[1] << 2) | (
buf[2] >> 6)) & 0x3f];
101 out += base64_enc_lookup[
buf[2] & 0x3f];
108 template<
class _Elem,
class _Traits,
class _Ax>
109 void encode(_Inout_ std::basic_string<_Elem, _Traits, _Ax> &out, _In_
size_t size)
112 out += base64_enc_lookup[
buf[0] >> 2];
114 out += base64_enc_lookup[((
buf[0] << 4) | (
buf[1] >> 4)) & 0x3f];
116 out += base64_enc_lookup[((
buf[1] << 2) | (
buf[2] >> 6)) & 0x3f];
117 out += base64_enc_lookup[
buf[2] & 0x3f];
119 out += base64_enc_lookup[(
buf[1] << 2) & 0x3f];
123 out += base64_enc_lookup[(
buf[0] << 4) & 0x3f];
143 static const char base64_enc_lookup[64] = {
144 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
145 'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
'a',
'b',
'c',
'd',
'e',
'f',
146 'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
147 'w',
'x',
'y',
'z',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'+',
'/'
178 template<
class _Ty,
class _Ax,
class _Tchr>
179 void decode(_Inout_ std::vector<_Ty, _Ax> &out, _Out_
bool &is_last, _In_z_count_(size)
const _Tchr *data, _In_
size_t size)
184 for (
size_t k = 0; k < size; k++)
185 if (!data[k]) { size = k;
break; }
188 out.reserve(out.size() +
dec_size(size));
190 for (
size_t i = 0;; i++) {
193 size_t nibbles =
decode(out);
205 if ((
buf[
num] = x < _countof(base64_dec_lookup) ? base64_dec_lookup[x] : 255) != 255)
229 return ((
num + size + 3)/4)*3;
237 template<
class _Ty,
class _Ax>
238 size_t decode(_Inout_ std::vector<_Ty, _Ax> &out)
240 out.push_back((_Ty)(((
buf[0] << 2) | (
buf[1] >> 4)) & 0xff));
242 out.push_back((_Ty)(((
buf[1] << 4) | (
buf[2] >> 2)) & 0xff));
244 out.push_back((_Ty)(((
buf[2] << 6) |
buf[3]) & 0xff));
260 static const unsigned char base64_dec_lookup[256] = {
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, 255, 255, 255, 255, 255,
264 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
265 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 64, 255, 255,
266 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
267 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255,
268 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
269 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 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,
277 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
Base64 decoding session.
Definition: base64.h:156
size_t num
Number of bytes used in buf
Definition: base64.h:255
base64_dec() noexcept
Constructs blank decoding session.
Definition: base64.h:161
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:179
size_t dec_size(size_t size) const noexcept
Returns maximum decoded size.
Definition: base64.h:227
size_t decode(std::vector< _Ty, _Ax > &out)
Decodes one complete internal buffer of data.
Definition: base64.h:238
void clear() noexcept
Resets decoding session.
Definition: base64.h:214
unsigned char buf[4]
Internal buffer.
Definition: base64.h:254
Base64 encoding session.
Definition: base64.h:19
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:41
unsigned char buf[3]
Internal buffer.
Definition: base64.h:137
void encode(std::basic_string< _Elem, _Traits, _Ax > &out)
Encodes one complete internal buffer of data.
Definition: base64.h:96
size_t num
Number of bytes used in buf
Definition: base64.h:138
void encode(std::basic_string< _Elem, _Traits, _Ax > &out, size_t size)
Encodes partial internal buffer of data.
Definition: base64.h:109
base64_enc() noexcept
Constructs blank encoding session.
Definition: base64.h:24
void clear() noexcept
Resets encoding session.
Definition: base64.h:72
size_t enc_size(size_t size) const noexcept
Returns maximum encoded size.
Definition: base64.h:85