こんにちは。きんくまです。
文字コードの本を読んでいます。
>> プログラマのための文字コード技術入門 (WEB+DB PRESS plus)
どうやって文字を表すのかということや、ビットを駆使してなんとか文字を詰め込んだりしてたことがわかって面白いです。
それで、base64という符号化の仕組みが本の中で出てきました。
名前を聞いたことがあっても、どういうものかいまいちわからなかったので、調べてみました。
そんで実際にエンコードしてみようと思い、プログラムを書いてみました。
#include <stdio.h> #include <string.h> int charToBinary(char s, char *binstr, int offset){ int encoded; int i; for(i = 0; i < 8; i++){ encoded = ((s >> (7 - i)) & 0x1) == 0 ? '0' : '1'; binstr[i + offset] = encoded; } return 0; } int sixbitToInt(char *binstr, int offset){ int i, n, bit, cnt; n = 0; cnt = 0; for(i = offset; i < offset + 6; i++){ bit = binstr[i] == '0' ? 0 : 1; n += bit << (5 - cnt); cnt++; } return n; } int main(int argc, char const *argv[]) { char msg[7] = "hello"; char binstr[64]; memset(binstr, '0', sizeof(binstr)); int i, j, b64; for(i = 0; i < 7; i++){ charToBinary(msg[i], binstr, i * 8); } printf("input 8bit : "); for(i = 0; i < 8; i++){ for(j = 0; j < 8; j++){ printf("%c", binstr[i * 8 + j]); } printf(" "); } printf("\n"); printf("input 6bit : "); for(i = 0; i < 9; i++){ for(j = 0; j < 6; j++){ printf("%c", binstr[i * 6 + j]); } printf(" "); } printf("\n"); printf("output: "); for(i = 0; i < 9; i++){ b64 = sixbitToInt(binstr, i * 6); printf("%d ", b64); } printf("\n"); return 0; }
hello という文字列をエンコードしたらどうなるかというものです。
出力はこうなります。
input 8bit : 01101000 01100101 01101100 01101100 01101111 00000000 00000000 00000000 input 6bit : 011010 000110 010101 101100 011011 000110 111100 000000 000000 output: 26 6 21 44 27 6 60 0 0
この本やWikiにもある通り、
1) 各1文字を8ビットで表す
2) それを6ビットずつに切り分ける
3) その数値と変換表を照らし合わせる
4) それを4文字ずつのセットにして、足りなかったら=で埋める
となっています。
helloをエンコードした後に、wikiの変換表を見ると次のようになります。
26 -> a, 6 -> G, 21 -> V, 44 -> s, 27 -> b, 6 -> G, 60 -> 8
つなげてかくと
aGVsbG8
全部で7文字なので、1文字分=で埋めれば
aGVsbG8=
となります。
オンラインでbase64に変換できるサービスがあったので、試してみたところ同じように出力されました。
>> Base64 Online – base64 decode and encode
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ