42 template<
class _Elem,
class _Traits,
class _Ax>
43 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)
45 assert(data || !size);
48 out.reserve(out.size() +
enc_size(size));
51 for (
size_t i = 0;; i++) {
60 buf[
num++] =
reinterpret_cast<const uint8_t*
>(data)[i];
87 size_t enc_size(_In_
size_t size)
const noexcept
89 return ((
num + size + 2)/3)*4;
97 template<
class _Elem,
class _Traits,
class _Ax>
98 void encode(_Inout_ std::basic_string<_Elem, _Traits, _Ax> &out)
100 out += base64_enc_lookup[
buf[0] >> 2 ];
101 out += base64_enc_lookup[((
buf[0] << 4) | (
buf[1] >> 4)) & 0x3f];
102 out += base64_enc_lookup[((
buf[1] << 2) | (
buf[2] >> 6)) & 0x3f];
103 out += base64_enc_lookup[
buf[2] & 0x3f];
110 template<
class _Elem,
class _Traits,
class _Ax>
111 void encode(_Inout_ std::basic_string<_Elem, _Traits, _Ax> &out, _In_
size_t size)
114 out += base64_enc_lookup[
buf[0] >> 2];
116 out += base64_enc_lookup[((
buf[0] << 4) | (
buf[1] >> 4)) & 0x3f];
118 out += base64_enc_lookup[((
buf[1] << 2) | (
buf[2] >> 6)) & 0x3f];
119 out += base64_enc_lookup[
buf[2] & 0x3f];
121 out += base64_enc_lookup[(
buf[1] << 2) & 0x3f];
125 out += base64_enc_lookup[(
buf[0] << 4) & 0x3f];
145 static const char base64_enc_lookup[64] = {
146 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
147 'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
'a',
'b',
'c',
'd',
'e',
'f',
148 'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
149 'w',
'x',
'y',
'z',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'+',
'/'
180 template<
class _Ty,
class _Ax,
class _Tchr>
181 void decode(_Inout_ std::vector<_Ty, _Ax> &out, _Out_
bool &is_last, _In_z_count_(size)
const _Tchr *data, _In_
size_t size)
186 for (
size_t k = 0; k < size; k++)
187 if (!data[k]) { size = k;
break; }
190 out.reserve(out.size() +
dec_size(size));
192 for (
size_t i = 0;; i++) {
195 size_t nibbles =
decode(out);
207 if ((
buf[
num] = x < _countof(base64_dec_lookup) ? base64_dec_lookup[x] : 255) != 255)
231 return ((
num + size + 3)/4)*3;
239 template<
class _Ty,
class _Ax>
240 size_t decode(_Inout_ std::vector<_Ty, _Ax> &out)
242 out.push_back((_Ty)(((
buf[0] << 2) | (
buf[1] >> 4)) & 0xff));
244 out.push_back((_Ty)(((
buf[1] << 4) | (
buf[2] >> 2)) & 0xff));
246 out.push_back((_Ty)(((
buf[2] << 6) |
buf[3]) & 0xff));
262 static const uint8_t base64_dec_lookup[256] = {
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, 255, 255, 255, 255, 255,
266 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
267 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 64, 255, 255,
268 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
269 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255,
270 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
271 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 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,
279 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
Base64 decoding session.
Definition base64.hpp:158
size_t num
Number of bytes used in buf
Definition base64.hpp:257
base64_dec() noexcept
Constructs blank decoding session.
Definition base64.hpp:163
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.hpp:181
size_t dec_size(size_t size) const noexcept
Returns maximum decoded size.
Definition base64.hpp:229
uint8_t buf[4]
Internal buffer.
Definition base64.hpp:256
size_t decode(std::vector< _Ty, _Ax > &out)
Decodes one complete internal buffer of data.
Definition base64.hpp:240
void clear() noexcept
Resets decoding session.
Definition base64.hpp:216
Base64 encoding session.
Definition base64.hpp:21
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.hpp:43
void encode(std::basic_string< _Elem, _Traits, _Ax > &out)
Encodes one complete internal buffer of data.
Definition base64.hpp:98
size_t num
Number of bytes used in buf
Definition base64.hpp:140
void encode(std::basic_string< _Elem, _Traits, _Ax > &out, size_t size)
Encodes partial internal buffer of data.
Definition base64.hpp:111
base64_enc() noexcept
Constructs blank encoding session.
Definition base64.hpp:26
uint8_t buf[3]
Internal buffer.
Definition base64.hpp:139
void clear() noexcept
Resets encoding session.
Definition base64.hpp:74
size_t enc_size(size_t size) const noexcept
Returns maximum encoded size.
Definition base64.hpp:87