可変長ビット列を出力
文字列型で渡された"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;
}圧縮するための二分木があって、あれがあれでそれでこれで、えーと、とか考えてると頭がめんどくさくなってくる。つまったら、とりあえずその場しのぎコード書くのよりこんがらがった糸を解いた方が良い。かも。ここで要求されている機能だけをシンプルにまとめよう。