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