65 static std::array<unsigned char, 128>
constexpr decode_table{
66 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
67 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
68 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
69 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
70 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
71 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
72 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
73 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64
81 if (s.size() % 4 != 0)
83 LOG_ERROR(
"Base64 string size not a multiple of 4");
87 const size_t output_size = s.size() / 4 * 3;
89 std::vector<unsigned char> output;
90 output.reserve(output_size);
92 for (
int i = 0; i < s.size(); i += 4)
94 const unsigned char c1 = s[i + 0] ==
'=' ? 0 : decode_table[
static_cast<unsigned char>(s[i + 0])];
95 const unsigned char c2 = s[i + 1] ==
'=' ? 0 : decode_table[
static_cast<unsigned char>(s[i + 1])];
96 const unsigned char c3 = s[i + 2] ==
'=' ? 0 : decode_table[
static_cast<unsigned char>(s[i + 2])];
97 const unsigned char c4 = s[i + 3] ==
'=' ? 0 : decode_table[
static_cast<unsigned char>(s[i + 3])];
99 const unsigned int bytes = (c1 << 18) | (c2 << 12) | (c3 << 6) | (c4 << 0);
101 output.push_back((bytes >> 16) & 0xFF);
102 output.push_back((bytes >> 8) & 0xFF);
103 output.push_back((bytes >> 0) & 0xFF);
112 if (s[s.size() - 2] ==
'=')
160 static constexpr std::array<std::array<int, 12>, 2> days =
162 { 0,31,59,90,120,151,181,212,243,273,304,334},
163 { 0,31,60,91,121,152,182,213,244,274,305,335}
166 return days[
IsLeap(year)][month - 1] + day - 1;