25 if (data.empty())
return out;
27 fl::size encoded_len = 4 * ((data.size() + 2) / 3);
31 fl::size len = data.size();
34 fl::u32 triple = (fl::u32(data[i]) << 16) |
35 (fl::u32(data[i + 1]) << 8) |
37 out += kBase64Chars[(triple >> 18) & 0x3F];
38 out += kBase64Chars[(triple >> 12) & 0x3F];
39 out += kBase64Chars[(triple >> 6) & 0x3F];
40 out += kBase64Chars[triple & 0x3F];
46 fl::u32 triple = fl::u32(data[i]) << 16;
48 triple |= fl::u32(data[i + 1]) << 8;
50 out += kBase64Chars[(triple >> 18) & 0x3F];
51 out += kBase64Chars[(triple >> 12) & 0x3F];
53 out += kBase64Chars[(triple >> 6) & 0x3F];
65 if (encoded.empty())
return out;
67 fl::size len = encoded.
size();
70 if (len % 4 != 0)
return out;
72 fl::size out_len = (len / 4) * 3;
73 if (len >= 1 && encoded[len - 1] ==
'=') out_len--;
74 if (len >= 2 && encoded[len - 2] ==
'=') out_len--;
77 for (fl::size i = 0; i < len; i += 4) {
78 int a = base64_char_index(encoded[i]);
79 int b = base64_char_index(encoded[i + 1]);
80 int c = (encoded[i + 2] ==
'=') ? 0 : base64_char_index(encoded[i + 2]);
81 int d = (encoded[i + 3] ==
'=') ? 0 : base64_char_index(encoded[i + 3]);
83 if (a < 0 || b < 0 || c < 0 || d < 0) {
87 fl::u32 triple = (fl::u32(a) << 18) | (fl::u32(b) << 12) |
88 (fl::u32(c) << 6) | fl::u32(d);
91 if (encoded[i + 2] !=
'=') {
94 if (encoded[i + 3] !=
'=') {