12static constexpr size_t DecodeBase64Length(
const char *s) {
13 size_t len = std::char_traits<char>::length(s);
14 if (s[len - 2] ==
'=')
15 return (len / 4) * 3 - 2;
16 else if (s[len - 1] ==
'=')
17 return (len / 4) * 3 - 1;
22static constexpr std::array<int, 256> PrepareBase64DecodeTable() {
23 std::array<int, 256> T{0};
25 for (
int i = 0; i < 256; i++)
27 for (
int i = 0; i < 64; i++)
28 T[
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
34static constexpr std::array<std::byte, N>
35DecodeBase64(std::string_view b64Str) {
36 constexpr auto T = PrepareBase64DecodeTable();
37 std::array<std::byte, N> out = {std::byte(0)};
39 for (
size_t i = 0, val = 0, posOut = 0;
40 i < b64Str.length() && T[b64Str[i]] != -1; i++) {
41 val = (val << 6) + T[b64Str[i]];
44 out[posOut] = std::byte((val >> valb) & 0xFF);