可変長ビット列を出力

文字列型で渡された"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;
}

圧縮するための二分木があって、あれがあれでそれでこれで、えーと、とか考えてると頭がめんどくさくなってくる。つまったら、とりあえずその場しのぎコード書くのよりこんがらがった糸を解いた方が良い。かも。ここで要求されている機能だけをシンプルにまとめよう。

test