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;
}