18 static const char base64_enc_lookup[64] = {
19 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
20 'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
'a',
'b',
'c',
'd',
'e',
'f',
21 'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
22 'w',
'x',
'y',
'z',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'+',
'/'
25 static const uint8_t base64_dec_lookup[256] = {
27 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
28 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
29 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
30 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 64, 255, 255,
31 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
32 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255,
33 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
34 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255,
35 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
36 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
37 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
38 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
39 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
40 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
41 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
42 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
71 template<
class _Elem,
class _Traits,
class _Ax>
72 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)
74 assert(data || !size);
77 out.reserve(out.size() +
enc_size(size));
80 for (
size_t i = 0;; i++) {
89 buf[
num++] =
reinterpret_cast<const uint8_t*
>(data)[i];
118 return ((
num + size + 2)/3)*4;
126 template<
class _Elem,
class _Traits,
class _Ax>
127 void encode(_Inout_ std::basic_string<_Elem, _Traits, _Ax> &out)
129 out += base64_enc_lookup[
buf[0] >> 2 ];
130 out += base64_enc_lookup[((
buf[0] << 4) | (
buf[1] >> 4)) & 0x3f];
131 out += base64_enc_lookup[((
buf[1] << 2) | (
buf[2] >> 6)) & 0x3f];
132 out += base64_enc_lookup[
buf[2] & 0x3f];
139 template<
class _Elem,
class _Traits,
class _Ax>
140 void encode(_Inout_ std::basic_string<_Elem, _Traits, _Ax> &out, _In_
size_t size)
143 out += base64_enc_lookup[
buf[0] >> 2];
145 out += base64_enc_lookup[((
buf[0] << 4) | (
buf[1] >> 4)) & 0x3f];
147 out += base64_enc_lookup[((
buf[1] << 2) | (
buf[2] >> 6)) & 0x3f];
148 out += base64_enc_lookup[
buf[2] & 0x3f];
150 out += base64_enc_lookup[(
buf[1] << 2) & 0x3f];
154 out += base64_enc_lookup[(
buf[0] << 4) & 0x3f];
198 template<
class _Ty,
class _Ax,
class _Tchr>
199 void decode(_Inout_ std::vector<_Ty, _Ax> &out, _Out_
bool &is_last, _In_z_count_(size)
const _Tchr *data, _In_
size_t size)
204 for (
size_t k = 0; k < size; k++)
205 if (!data[k]) { size = k;
break; }
208 out.reserve(out.size() +
dec_size(size));
210 for (
size_t i = 0;; i++) {
213 size_t nibbles =
decode(out);
225 if ((
buf[
num] = x < _countof(base64_dec_lookup) ? base64_dec_lookup[x] : 255) != 255)
249 return ((
num + size + 3)/4)*3;
257 template<
class _Ty,
class _Ax>
258 size_t decode(_Inout_ std::vector<_Ty, _Ax> &out)
260 out.push_back((_Ty)(((
buf[0] << 2) | (
buf[1] >> 4)) & 0xff));
262 out.push_back((_Ty)(((
buf[1] << 4) | (
buf[2] >> 2)) & 0xff));
264 out.push_back((_Ty)(((
buf[2] << 6) |
buf[3]) & 0xff));
Base64 decoding session.
Definition base64.hpp:176
size_t num
Number of bytes used in buf
Definition base64.hpp:275
base64_dec() noexcept
Constructs blank decoding session.
Definition base64.hpp:181
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:199
size_t dec_size(size_t size) const noexcept
Returns maximum decoded size.
Definition base64.hpp:247
uint8_t buf[4]
Internal buffer.
Definition base64.hpp:274
size_t decode(std::vector< _Ty, _Ax > &out)
Decodes one complete internal buffer of data.
Definition base64.hpp:258
void clear() noexcept
Resets decoding session.
Definition base64.hpp:234
Base64 encoding session.
Definition base64.hpp:50
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:72
void encode(std::basic_string< _Elem, _Traits, _Ax > &out)
Encodes one complete internal buffer of data.
Definition base64.hpp:127
size_t num
Number of bytes used in buf
Definition base64.hpp:169
void encode(std::basic_string< _Elem, _Traits, _Ax > &out, size_t size)
Encodes partial internal buffer of data.
Definition base64.hpp:140
base64_enc() noexcept
Constructs blank encoding session.
Definition base64.hpp:55
uint8_t buf[3]
Internal buffer.
Definition base64.hpp:168
void clear() noexcept
Resets encoding session.
Definition base64.hpp:103
size_t enc_size(size_t size) const noexcept
Returns maximum encoded size.
Definition base64.hpp:116