Base64 encode and validating decode in compact C
C
#include <string.h>
static const char T[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
void b64_encode(const unsigned char *in, size_t n, char *out) {
for (size_t i = 0; i < n; i += 3) {
unsigned v = (unsigned)in[i] << 16 | (i + 1 < n ? (unsigned)in[i + 1] << 8 : 0) | (i + 2 < n ? in[i + 2] : 0);
*out++ = T[v >> 18]; *out++ = T[(v >> 12) & 63];
*out++ = i + 1 < n ? T[(v >> 6) & 63] : '=';
*out++ = i + 2 < n ? T[v & 63] : '=';
}
*out = '\0';
}
int b64_decode(const char *in, unsigned char *out, size_t *len) {
unsigned acc = 0; int bits = 0; size_t n = 0;
for (; *in && *in != '='; in++) {
const char *p = strchr(T, *in);
if (!p) return -1;
acc = (acc << 6) | (unsigned)(p - T); bits += 6;
if (bits >= 8) { bits -= 8; out[n++] = (unsigned char)(acc >> bits); }
}
while (*in == '=') in++;
*len = n; return *in ? -1 : 0;
}