freeswitch/libs/xmlrpc-c/lib/libutil/base64.c

50 lines
1.3 KiB
C
Raw Normal View History

#include <string.h>
#include "int.h"
#include "xmlrpc-c/base64_int.h"
void
xmlrpc_base64Encode(const char * const chars,
char * const base64) {
/* Conversion table. */
static char tbl[64] = {
'A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X',
'Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3',
'4','5','6','7','8','9','+','/'
};
unsigned int i;
uint32_t length;
char * p;
const char * s;
length = strlen(chars); /* initial value */
s = &chars[0]; /* initial value */
p = &base64[0]; /* initial value */
/* Transform the 3x8 bits to 4x6 bits, as required by base64. */
for (i = 0; i < length; i += 3) {
*p++ = tbl[s[0] >> 2];
*p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
*p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
*p++ = tbl[s[2] & 0x3f];
s += 3;
}
/* Pad the result if necessary... */
if (i == length + 1)
*(p - 1) = '=';
else if (i == length + 2)
*(p - 1) = *(p - 2) = '=';
/* ...and zero-terminate it. */
*p = '\0';
}