//======================================================================== // // gbase64.cc // // Implementation of a base64 encoder, because another one did not immediately // avail itself. // // This file is licensed under the GPLv2 or later // // Copyright (C) 2018 Greg Knight // //======================================================================== #include "gbase64.h" #include static void b64encodeTriplet(char output[4], unsigned char a, unsigned char b, unsigned char c) { static const char *base64table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; output[0] = base64table[((a >> 2) & 0x3f)]; // upper 6 of first byte output[1] = base64table[((a << 4) & 0x30) | ((b >> 4) & 0x0f)]; // lower 2 of first byte, upper 4 of second byte output[2] = base64table[((b << 2) & 0x3c) | ((c >> 6) & 0x03)]; // lower 4 of second byte, upper 2 of third byte output[3] = base64table[((c)&0x3f)]; // lower 6 of third byte } std::string gbase64Encode(const void *input, size_t len) { char quad[4]; size_t pos = 0; std::stringstream buf; auto bytes = static_cast(input); for (; pos + 3 <= len; pos += 3) { b64encodeTriplet(quad, bytes[0], bytes[1], bytes[2]); buf.write(&quad[0], 4); bytes += 3; } switch (len - pos) { case 1: b64encodeTriplet(quad, bytes[0], 0, 0); quad[2] = quad[3] = '='; buf.write(&quad[0], 4); break; case 2: b64encodeTriplet(quad, bytes[0], bytes[1], 0); quad[3] = '='; buf.write(&quad[0], 4); break; } return buf.str(); }