编辑代码

#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;
}