ちゃらっと書いてみたBase64デコードのソース(C言語)
とりあえずまともに書いたらこんな感じかな??
プログラム引数にBase64文字列を指定すると、文字列を出力してくれる。
ソース
#include <stdio.h> #include <string.h> int main(int argc, char **argv){ char b64[128], *w = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; char *p, c[4], *buff = p; int i = 0, j; if(argc != 2){ fprintf(stderr, "引数に文字列を指定してください。\n"); return 1; } p = argv[1] /* 変換テーブルの作成 */ for(j = 0; j < 65; j++)b64[w[j]] = j % 64; while(*p){ /* 4文字ずつ変換 */ for(j = 0; j < 4; j++)c[j] = b64[*(p++)]; for(j = 0; j < 3; j++)buff[i++] = c[j] << (j * 2 + 2) | c[j + 1] >> ((2 - j) * 2); } buff[i] = '\0'; puts(buff); return 0; }
実行例
$ ./a.exe I2luY2x1ZGUgPHN0ZGlvLmg+
#include
おまけ(ショートコーディング)
2つ目のfor文がミソ
charを使いたかったので、mainの引数の型宣言を省けなかったのが痛い。。
main(int i, char **p){ char *w = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", j = 64, c[4], x[128]; for(; --j; x[w[j]] = j % 64); for(++p; **p; j = ++j % 4)c[j] = x[*(*p)++], j && putchar(c[j - 1] << j * 2 | c[j] >> (3 - j) * 2); }
スペース改行省いて211バイト。。まだ何とかなりそう・・