17#ifndef DAF_BASE64_HPP_INCLUDED
18#define DAF_BASE64_HPP_INCLUDED
20#include "../DafUtils.hpp"
55namespace DafBase64Helpers {
57static constexpr const char*
const kBase64Chars =
58 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
59 "abcdefghijklmnopqrstuvwxyz"
63uint8_t findBase64CharIndex(
const char c)
65 static const uint8_t kBase64CharsLen =
static_cast<uint8_t
>(std::strlen(kBase64Chars));
67 for (uint8_t i=0; i<kBase64CharsLen; ++i)
69 if (kBase64Chars[i] == c)
73 d_stderr2(
"findBase64CharIndex('%c') - failed", c);
77static constexpr inline
78bool isBase64Char(
const char c)
80 return (c >=
'A' && c <=
'Z') || (c >=
'a' && c <=
'z') || (c >=
'0' && c <=
'9') || c ==
'+' || c ==
'/';
89void d_getChunkFromBase64String_impl(std::vector<uint8_t>& vector,
const char*
const base64string)
92 DAF_SAFE_ASSERT_RETURN(base64string !=
nullptr,);
95 uint charArray3[3], charArray4[4];
97 vector.reserve(std::strlen(base64string)*3/4 + 4);
99 for (std::size_t l=0, len=std::strlen(base64string); l<len; ++l)
101 const char c = base64string[l];
103 if (c ==
'\0' || c ==
'=')
105 if (c ==
' ' || c ==
'\n')
108 DAF_SAFE_ASSERT_CONTINUE(DafBase64Helpers::isBase64Char(c));
110 charArray4[i++] =
static_cast<uint
>(c);
115 charArray4[i] = DafBase64Helpers::findBase64CharIndex(
static_cast<char>(charArray4[i]));
117 charArray3[0] = (charArray4[0] << 2) + ((charArray4[1] & 0x30) >> 4);
118 charArray3[1] = ((charArray4[1] & 0xf) << 4) + ((charArray4[2] & 0x3c) >> 2);
119 charArray3[2] = ((charArray4[2] & 0x3) << 6) + charArray4[3];
122 vector.push_back(
static_cast<uint8_t
>(charArray3[i]));
130 for (j=0; j<i && j<4; ++j)
131 charArray4[j] = DafBase64Helpers::findBase64CharIndex(
static_cast<char>(charArray4[j]));
136 charArray3[0] = (charArray4[0] << 2) + ((charArray4[1] & 0x30) >> 4);
137 charArray3[1] = ((charArray4[1] & 0xf) << 4) + ((charArray4[2] & 0x3c) >> 2);
138 charArray3[2] = ((charArray4[2] & 0x3) << 6) + charArray4[3];
140 for (j=0; i>0 && j<i-1; j++)
141 vector.push_back(
static_cast<uint8_t
>(charArray3[j]));
146std::vector<uint8_t> d_getChunkFromBase64String(
const char*
const base64string)
148 std::vector<uint8_t> ret;
149 d_getChunkFromBase64String_impl(ret, base64string);