PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Base64



krypt0n
08.04.2010, 05:30
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[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx yz0123456789+/";
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[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx yz0123456789+/";
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).

GregorSamsa
08.04.2010, 06:41
Unordentlich finde ich das jetzt nicht.

Und danke, sowas kann man immermal gebrauchen!