Base64 encode and validating decode
C++
#include <stdexcept>
#include <string>
const std::string kTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
std::string base64Encode(const std::string& in) {
std::string out;
for (std::size_t i = 0; i < in.size(); i += 3) {
unsigned v = (unsigned char)in[i] << 16 | (i + 1 < in.size() ? (unsigned char)in[i + 1] << 8 : 0) | (i + 2 < in.size() ? (unsigned char)in[i + 2] : 0);
out += kTable[v >> 18 & 63]; out += kTable[v >> 12 & 63]; out += i + 1 < in.size() ? kTable[v >> 6 & 63] : '='; out += i + 2 < in.size() ? kTable[v & 63] : '=';
}
return out;
}
std::string base64Decode(const std::string& s) {
if (s.size() % 4) throw std::invalid_argument("base64 length must be a multiple of 4");
std::string out;
for (std::size_t i = 0; i < s.size(); i += 4) {
unsigned v = 0;
for (int j = 0; j < 4; ++j) { char c = s[i + j]; v <<= 6; if (c != '=') { auto p = kTable.find(c); if (p == std::string::npos) throw std::invalid_argument("invalid base64 character"); v |= unsigned(p); } }
out += char(v >> 16 & 255); if (s[i + 2] != '=') out += char(v >> 8 & 255); if (s[i + 3] != '=') out += char(v & 255);
}
return out;
}