FastLED 3.10.8
Loading...
Searching...
No Matches
base64.cpp.hpp
Go to the documentation of this file.
2#include "fl/stl/cstring.h"
3#include "fl/stl/noexcept.h"
4
5namespace fl {
6
7namespace {
8
9static const char kBase64Chars[] =
10 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
11
12static int base64_char_index(char c) FL_NO_EXCEPT {
13 if (c >= 'A' && c <= 'Z') return c - 'A';
14 if (c >= 'a' && c <= 'z') return c - 'a' + 26;
15 if (c >= '0' && c <= '9') return c - '0' + 52;
16 if (c == '+') return 62;
17 if (c == '/') return 63;
18 return -1;
19}
20
21} // namespace
22
24 fl::string out;
25 if (data.empty()) return out;
26
27 fl::size encoded_len = 4 * ((data.size() + 2) / 3);
28 out.reserve(encoded_len);
29
30 fl::size i = 0;
31 fl::size len = data.size();
32
33 while (i + 2 < len) {
34 fl::u32 triple = (fl::u32(data[i]) << 16) |
35 (fl::u32(data[i + 1]) << 8) |
36 fl::u32(data[i + 2]);
37 out += kBase64Chars[(triple >> 18) & 0x3F];
38 out += kBase64Chars[(triple >> 12) & 0x3F];
39 out += kBase64Chars[(triple >> 6) & 0x3F];
40 out += kBase64Chars[triple & 0x3F];
41 i += 3;
42 }
43
44 // Handle remaining bytes
45 if (i < len) {
46 fl::u32 triple = fl::u32(data[i]) << 16;
47 if (i + 1 < len) {
48 triple |= fl::u32(data[i + 1]) << 8;
49 }
50 out += kBase64Chars[(triple >> 18) & 0x3F];
51 out += kBase64Chars[(triple >> 12) & 0x3F];
52 if (i + 1 < len) {
53 out += kBase64Chars[(triple >> 6) & 0x3F];
54 } else {
55 out += '=';
56 }
57 out += '=';
58 }
59
60 return out;
61}
62
65 if (encoded.empty()) return out;
66
67 fl::size len = encoded.size();
68
69 // Validate length is multiple of 4
70 if (len % 4 != 0) return out;
71
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--;
75 out.reserve(out_len);
76
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]);
82
83 if (a < 0 || b < 0 || c < 0 || d < 0) {
84 return fl::vector<fl::u8>(); // invalid character
85 }
86
87 fl::u32 triple = (fl::u32(a) << 18) | (fl::u32(b) << 12) |
88 (fl::u32(c) << 6) | fl::u32(d);
89
90 out.push_back((triple >> 16) & 0xFF);
91 if (encoded[i + 2] != '=') {
92 out.push_back((triple >> 8) & 0xFF);
93 }
94 if (encoded[i + 3] != '=') {
95 out.push_back(triple & 0xFF);
96 }
97 }
98
99 return out;
100}
101
102} // namespace fl
void reserve(fl::size newCapacity) FL_NO_EXCEPT
fl::size size() const FL_NO_EXCEPT
void reserve(fl::size n) FL_NO_EXCEPT
Definition vector.h:591
void push_back(const T &value) FL_NO_EXCEPT
Definition vector.h:624
static int base64_char_index(char c) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
fl::vector< fl::u8 > base64_decode(const fl::string &encoded) FL_NO_EXCEPT
fl::string base64_encode(fl::span< const fl::u8 > data) FL_NO_EXCEPT
Base definition for an LED controller.
Definition crgb.hpp:179