可変長ビット列を出力
文字列型で渡された"10111"みたいなビット列を、実際のビット列として書き出す関数putbitsを作ろう。でも困ったことにコンピュータさんは、8の倍数ビット単位での読み書きしかできないらしい。というか、だからこんな関数が必要になるわけだが。
putbits("10111", stdout)
みたいにすると、putbits関数内で保持している静的変数bitsに1ビットずつ追記していく。でもってbitsの長さが8ビットに達するたびに、bitsを出力。bitsの長さが8ビット未満で終わったら、その値は次回のために取っておく。
NULLポインターを渡されたら、保持しているbitsのうしろに0を詰めてって出力。
int putbits(char *bitstream, FILE *fp){ static int length = 0; static unsigned char bits = 0; if(bitstream != NULL){ while(*bitstream != '\0'){ bits = (bits << 1) | (*bitstream - '0'); ++length; if(length == 8){ fwrite(&bits, 1, 1, fp); length = 0; bits = 0; } ++bitstream; } } else { while(length != 8){ bits = (bits << 1); ++length; } fwrite(&bits, 1, 1, fp); } return 1; }
圧縮するための二分木があって、あれがあれでそれでこれで、えーと、とか考えてると頭がめんどくさくなってくる。つまったら、とりあえずその場しのぎコード書くのよりこんがらがった糸を解いた方が良い。かも。ここで要求されている機能だけをシンプルにまとめよう。