static inline unsigned char _uchar(char ch) { return ch; } unsigned char *base64_encode(const unsigned char *src, size_t len, size_t *out_len) { /* list of valid base 64 chars */ static const unsigned char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; unsigned char *out; unsigned char *pos; *out_len = len + (len / 3) + (len % 3 > 0 ? 1 : 0) + 1; out = malloc(*out_len); if (out == NULL) return NULL; pos = out - 1; while (len) { /* first 6 bytes */ *++pos = b64[(_uchar(src[0]) >> 2) & 0x3f]; if (!--len) { *++pos = b64[(_uchar(src[0]) << 4) & 0x3f]; break; } else *++pos = b64[((_uchar(src[0]) << 4) + (_uchar(src[1]) >> 4)) & 0x3f]; if (!--len) { *++pos = b64[(_uchar(src[1]) << 2) & 0x3f]; break; } else *++pos = b64[((_uchar(src[1]) << 2) + (_uchar(src[2]) >> 6)) & 0x3f]; if (!len--) break; *++pos = b64[_uchar(src[2]) & 0x3f]; src += 3; } *++pos = '\0'; return out; } unsigned char *base64_decode(const unsigned char *src, size_t len, size_t *out_len) { /* list of valid base 64 chars */ static const unsigned char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; unsigned char *out, *pos; *out_len = len; out = malloc(*out_len); if (out == NULL) return NULL; pos = out - 1; while (len) { if (!strchr(b64, src[0]) || !strchr(b64, src[1])) break; *++pos = (((int)strchr(b64, src[0]) - (int)b64) << 2) + (((int)strchr(b64, src[1]) - (int)b64) >> 4); if (!--len) break; if (!strchr(b64, src[2])) break; *++pos = (((int)strchr(b64, src[1]) - (int)b64) << 4) + (((int)strchr(b64, src[2]) - (int)b64) >> 2); if (!--len || !--len) break; if (!strchr(b64, src[3])) break; *++pos = (((int)strchr(b64, src[2]) - (int)b64) << 6) + (((int)strchr(b64, src[3]) - (int)b64)); len--; src += 4; } *++pos = '\0'; // set real size *out_len = pos - out + 1; pos = realloc(out, *out_len); if (pos == NULL) return NULL; out = pos; return out; }
Habe gerade noch ein älteres Snipet einer Base64 Funktion von mir gefunden. AFAIK habe ich kurz eine kleine base64 Funktion gebraucht und diese Nachher mit irgend nem anderen Snippet noch ein bisschen gepimpt. Insgesamt ist es etwas unordentlich, aber das ganze funktioniert immerhin (zumindest bei meinem kurzen Test vorhin).
Credits: krypt0n