ちゃらっと書いてみたBase64エンコードのソース(C言語)

とりあえずまともに書いたらこんな感じかな??

プログラム引数に文字列を指定すると、Base64文字列を出力してくれる。

ソース

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {
	char *w = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	unsigned char *p = argv[1], *buff;
	int i = 0, x = 0, l = 0;

	buff = (char *)malloc((strlen(p) * 4 / 3 + 3) & ~0x03 + 1);

	for (; *p; p++) {
		x = x << 8 | *p;
		for (l += 8; l >= 6; l -= 6) {
			buff[i++] = w[(x >> (l - 6)) & 0x3f];
		}
	}
	if (l > 0) {
		x <<= 6 - l;
		buff[i++] = w[x & 0x3f];
	}
	for (; i % 4;) {
		buff[i++] = '=';
	}
	puts(buff);
	free(buff);

	return 0;
}

実行例

$ ./a "#include <stdio.h>"
I2luY2x1ZGUgPHN0ZGlvLmg+

おまけ

あまり頑張っていないショートコーディング。。
痛過ぎる;;
しかもunsignedじゃないのでマルチバイトもじ無視www

x,l;main(int i,char**p){
	char*w="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	for(++p;**p;)for(x=x<<8|*(*p)++,l+=8;l>=6;putchar(w[x>>(l-=6)&63]));
	if(l)for(x<<=l=6-l,putchar(w[x&63]);l;l-=2)printf("=");
}

スペース省いて222バイト。。