hope this helps. i don't remember where i found it...
any way, here you are.
#include <stdio.h>
#include "base64.h"
unsigned char alphabet[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int
base64_decode(unsigned char *outbuf, unsigned char *inbuf, int size)
{
static unsigned char inalphabet[256], decoder[256];
int j, i, bits, c, char_count, errors = 0;
for (i = (sizeof alphabet) - 1; i >= 0 ; i--) {
inalphabet[alphabet[i]] = 1;
decoder[alphabet[i]] = i;
}
char_count = 0;
bits = 0;
i = 0;
j = 0;
while (i<size) {
c = inbuf[i++];
if (c == '=') break;
if (c > 255 || ! inalphabet[c]) continue;
bits += decoder[c];
char_count++;
if (char_count == 4) {
outbuf[j++] = bits >> 16;
outbuf[j++] = (bits >> 8) & 0xff;
outbuf[j++] = bits & 0xff;
bits = 0;
char_count = 0;
} else {
bits <<= 6;
}
}
if (c == EOF) {
if (char_count) errors++;
} else { /* c == '=' */
switch (char_count) {
case 1:
errors++;
break;
case 2:
outbuf[j++] = bits >> 10;
break;
case 3:
outbuf[j++] = bits >> 16;
outbuf[j++] = (bits >> 8) & 0xff;
break;
}
}
return (errors ? 0 : j);
}
int
base64_encode(unsigned char *outbuf, unsigned char *inbuf, int size)
{
int i, j, cols, bits, c, char_count;
char_count = 0;
bits = 0;
cols = 0;
i = 0;
j = 0;
while (i<size) {
c = inbuf[i++];
bits += c;
char_count++;
if (char_count == 3) {
outbuf[j++] = alphabet[bits >> 18];
outbuf[j++] = alphabet[(bits >> 12) & 0x3f];
outbuf[j++] = alphabet[(bits >> 6) & 0x3f];
outbuf[j++] = alphabet[bits & 0x3f];
cols += 4;
if (cols == 72) {
outbuf[j++] = '\n';
cols = 0;
}
bits = 0;
char_count = 0;
} else {
bits <<= 8;
}
}
if (char_count != 0) {
bits <<= 16 - (8 * char_count);
outbuf[j++] = alphabet[bits >> 18];
outbuf[j++] = alphabet[(bits >> 12) & 0x3f];
if (char_count == 1) {
outbuf[j++] = '=';
outbuf[j++] = '=';
} else {
outbuf[j++] = alphabet[(bits >> 6) & 0x3f];
outbuf[j++] = '=';
}
if (cols > 0) outbuf[j++] = '\n';
}
return j;
}