#define g_realloc realloc char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" "0123456789+/"; char *tobase64(const char *text) out = g_realloc(out, len + 4); out[len] = alphabet[(tmp >> 18) & 0x3f]; out[len + 1] = alphabet[(tmp >> 12) & 0x3f]; out[len + 2] = alphabet[(tmp >> 6) & 0x3f]; out[len + 3] = alphabet[tmp & 0x3f]; out = g_realloc(out, len + 5); out[len] = alphabet[(tmp >> 18) & 0x3f]; out[len + 1] = alphabet[(tmp >> 12) & 0x3f]; out[len + 2] = alphabet[(tmp >> 6) & 0x3f]; out = g_realloc(out, len + 5); out[len] = alphabet[(tmp >> 18) & 0x3f]; out[len + 1] = alphabet[(tmp >> 12) & 0x3f]; out = g_realloc(out, len + 1); void frombase64(const char *text, char **data, int *size) if (*c >= 'A' && *c <= 'Z') { } else if (*c >= 'a' && *c <= 'z') { } else if (*c >= '0' && *c <= 57) { out = g_realloc(out, len + 2); out[len] = (char)(tmp2 >> 10) & 0xff; out[len] = (char)(tmp2 >> 2) & 0xff; out = g_realloc(out, len + 1); out[len] = (char)(tmp2 >> 4) & 0xff; tmp2 = ((tmp2 << 6) | (tmp & 0xff)); out = g_realloc(out, len + 3); out[len] = (char)((tmp2 >> 16) & 0xff); out[len] = (char)((tmp2 >> 8) & 0xff); out[len] = (char)(tmp2 & 0xff); out = g_realloc(out, len + 1); int main(int argc, char **argv) printf("%s\n", tobase64(argv[2])); frombase64(argv[2], &data, &len); f = fopen("output", "w");