/* ファイルを base64 に変換するプログラム 使い方:enbase64 file file は変換したいファイルの名前です。結果は一行あたり 76 文字で、標準出力に 送られます。 */ #include /* 0 から 63 までの数値を base64 に使われる文字に変換するマクロ */ #define convert(X) \ ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(X)]) int main(int argc, char* argv[]) { FILE* in; int i, c, d; if (argc != 2) { fprintf(stderr, "Usage: %s file\n", argv[0]); return 1; } if ((in = fopen(argv[1], "rb")) == NULL) { fprintf(stderr, "Can't open \"%s\".\n", argv[1]); return 1; } for (i = 0; (c = fgetc(in)) != EOF; i++) { if (i == 76 * 3 / 4) { /* 76 文字ごとに改行する */ putchar('\n'); i = 0; } switch (i % 3) { case 0: putchar(convert(c >> 2)); d = (c & 0x03) << 4; break; case 1: putchar(convert(d | c >> 4)); d = (c & 0x0f) << 2; break; case 2: putchar(convert(d | c >> 6)); putchar(convert(c & 0x3f)); } } switch (i % 3) { /* 改行、“余ったバイト”の処理 */ case 0: putchar('\n'); break; case 1: printf("%c==\n", convert(d)); break; case 2: printf("%c=\n", convert(d)); } fclose(in); return 0; }