31 #include <encode/base64.h>
39 using namespace scc::encode;
45 static const char encVal[65] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
56 static unsigned char decVal[128] =
58 66, 66, 66, 66, 66, 66, 66, 66, 66, 65, 65, 66, 66, 65, 66, 66,
59 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
60 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 62, 66, 66, 66, 63,
61 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66, 66, 66, 64, 66, 66,
62 66, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
63 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 66, 66, 66, 66, 66,
64 66, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
65 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 66, 66, 66, 66, 66,
72 unsigned char* v = (
unsigned char*)&vin[0];
77 s.reserve((vin.size() + 2)/3 * 4);
79 for (
size_t i = 0; i < vin.size(); ++i)
86 int val = (b >> (bc-6)) & 63;
87 s.push_back(encVal[val]);
94 int val = (b << (6-bc)) & 63;
95 s.push_back(encVal[val]);
100 case 2: s.push_back(
'=');
101 case 4: s.push_back(
'=');
105 template void Base64::base64_encode<char>(
const std::vector<char>&, std::string&);
106 template void Base64::base64_encode<unsigned char>(
const std::vector<unsigned char>&, std::string&);
110 std::vector<char> v(s.begin(), s.end());
112 base64_encode(v, ret);
126 for (std::string::const_iterator i = s.begin(); i != s.end(); ++i)
128 if (*i < 0 || *i > 127)
134 int d = decVal[(int)*i];
146 b = (b << 6) | (d & 63);
153 int val = b >> (bc-8);
155 v.push_back(val & 255);
160 if (bc - 2*pc) ok =
false;
165 template bool Base64::base64_decode<char>(
const std::string& s, std::vector<char>& v) noexcept;
166 template bool Base64::base64_decode<unsigned char>(
const std::string& s, std::vector<unsigned char>& v) noexcept;
171 if (!base64_decode(s, v))
173 return std::string();
175 return std::string(v.begin(), v.end());
183 if (ch ==
'+') ret.push_back(
'-');
184 else if (ch ==
'/') ret.push_back(
'_');
185 else if (ch !=
'=') ret.push_back(ch);
195 if (ch ==
'-') ret.push_back(
'+');
196 else if (ch ==
'_') ret.push_back(
'/');
197 else ret.push_back(ch);
199 switch (u.size() % 4)
201 case 2: ret +=
"==";
break;
202 case 3: ret +=
"=";
break;
static std::string base64_to_str(const std::string &) noexcept
Convert from base64 string to string.
static void base64_encode(const std::vector< T > &, std::string &) noexcept
Convert from binary to base64 string.
static std::string str_to_base64(const std::string &s) noexcept
Convert from string to base64 string.
static std::string base64_to_base64url(const std::string &) noexcept
Convert from base64 to base64url.
static bool base64_decode(const std::string &, std::vector< T > &) noexcept
Convert from base64 string to binary.
static std::string base64url_to_base64(const std::string &) noexcept
Convert from base64url to base64.