24 if (data.
empty())
return out;
26 fl::size encoded_len = 4 * ((data.
size() + 2) / 3);
30 fl::size len = data.
size();
33 fl::u32 triple = (fl::u32(data[i]) << 16) |
34 (fl::u32(data[i + 1]) << 8) |
36 out += kBase64Chars[(triple >> 18) & 0x3F];
37 out += kBase64Chars[(triple >> 12) & 0x3F];
38 out += kBase64Chars[(triple >> 6) & 0x3F];
39 out += kBase64Chars[triple & 0x3F];
45 fl::u32 triple = fl::u32(data[i]) << 16;
47 triple |= fl::u32(data[i + 1]) << 8;
49 out += kBase64Chars[(triple >> 18) & 0x3F];
50 out += kBase64Chars[(triple >> 12) & 0x3F];
52 out += kBase64Chars[(triple >> 6) & 0x3F];
64 if (encoded.
empty())
return out;
66 fl::size len = encoded.
size();
69 if (len % 4 != 0)
return out;
71 fl::size out_len = (len / 4) * 3;
72 if (len >= 1 && encoded[len - 1] ==
'=') out_len--;
73 if (len >= 2 && encoded[len - 2] ==
'=') out_len--;
76 for (fl::size i = 0; i < len; i += 4) {
77 int a = base64_char_index(encoded[i]);
78 int b = base64_char_index(encoded[i + 1]);
79 int c = (encoded[i + 2] ==
'=') ? 0 : base64_char_index(encoded[i + 2]);
80 int d = (encoded[i + 3] ==
'=') ? 0 : base64_char_index(encoded[i + 3]);
82 if (a < 0 || b < 0 || c < 0 || d < 0) {
86 fl::u32 triple = (fl::u32(a) << 18) | (fl::u32(b) << 12) |
87 (fl::u32(c) << 6) | fl::u32(d);
90 if (encoded[i + 2] !=
'=') {
93 if (encoded[i + 3] !=
'=') {