16 constexpr std::string_view codes =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
20 encode(std::shared_ptr<MemoryChunk> memory)
25 for(
int input_index = 0; input_index < input.
get_size(); input_index += 3)
27 int b = (input[input_index] & 0xFC) >> 2;
28 out.add_char(codes[
b]);
29 b = (input[input_index] & 0x03) << 4;
30 if(input_index + 1 < input.
get_size())
32 b |= (input[input_index + 1] & 0xF0) >> 4;
33 out.add_char(codes[
b]);
34 b = (input[input_index + 1] & 0x0F) << 2;
35 if(input_index + 2 < input.
get_size())
37 b |= (input[input_index + 2] & 0xC0) >> 6;
38 out.add_char(codes[
b]);
39 b = input[input_index + 2] & 0x3F;
40 out.add_char(codes[
b]);
44 out.add_char(codes[
b]);
50 out.add_char(codes[
b]);
55 return out.to_string();
58 std::shared_ptr<MemoryChunk>
61 if(input.length() % 4 == 0)
64 auto asize = (input.length() * 3) / 4;
65 auto found = input.find(
'=') != std::string::npos;
66 auto bsize = found ? (input.length() - input.find(
'=')) : 0;
73 int decoded_index = 0;
74 for(
int input_index = 0; input_index <
c_sizet_to_int(input.size()); input_index += 4)
77 const auto b = std::array<size_t, 4>
84 decoded[decoded_index++] =
static_cast<char>((
b[0] << 2) | (
b[1] >> 4));
87 decoded[decoded_index++] =
static_cast<char>((
b[1] << 4) | (
b[2] >> 2));
90 decoded[decoded_index++] =
static_cast<char>((
b[2] << 6) |
b[3]);
std::string encode(std::shared_ptr< MemoryChunk > memory)
std::shared_ptr< MemoryChunk > decode(const std::string &input)
int c_sizet_to_int(size_t t)
size_t c_int_to_sizet(int i)
static std::shared_ptr< MemoryChunk > allocate(int size)
static std::shared_ptr< MemoryChunk > create_null()