#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned char byte;
typedef struct {
byte* data;
size_t size;
} Result;
byte get_two_bits(byte x, byte n) {
return (x >> (n - 1)) & 0b11;
}
Result base64encode(byte* data, size_t size) {
byte* map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
size_t result_size = size;
if (result_size % 3 == 0)
result_size = result_size / 3 * 4;
else
result_size = (result_size / 3 + 1) * 4;
byte* result_ptr = malloc(result_size);
byte tmp = 0;
size_t i, j;
for (i = 0, j = 0; i < result_size - 2; i+=4, j+=3) {
result_ptr[i] = map[data[j] >> 2];
result_ptr[i + 1] = map[(data[j] & 0b11) << 4 | (data[j + 1] >> 4)];
result_ptr[i+2]=map[(data[j + 1] & 0b1111) << 2 | (data[j + 2] >> 6)];
result_ptr[i+3]=map[data[j + 2] & 0b111111];
}
switch(size % 3)
{
case 1:
result_ptr[i-2]='=';
result_ptr[i-1]='=';
break;
case 2:
result_ptr[i-1]='=';
break;
}
Result res = { result_ptr, result_size };
return res;
}
int main(void) {
Result res = base64encode("Hello, world", 13);
for (size_t i = 0; i < res.size; i++) {
putchar(res.data[i]);
}
return 0;
}