deflateによって圧縮されたファイルには3種類のブロックがあって、無圧縮ブロック、固定ハフマンブロック、動的ハフマンブロックとあるのだけど、「無圧縮」があることでデーコーダーの設計に迷いが生じる。

デコーダーはヘッダの読み込み後に、3bit読むことでブロックの種類がわかるわけだけど、3種のブロックのうち無圧縮ブロックだけはビット単位ではなくバイト単位でデータをあつかったほうが効率がいい。

でも、はじめの3bitの読み込みの部分と他の2種のブロックではビット単位での読み込みのほうがいい。

無圧縮ブロックであっても別に問題になるほどの速度差は出なそうなので、ビット単位に分割してから、またバイトにまとめるというやりかたをしても、まあいいのかもしれない。けど、なんか美しくないんだよな。

Reply to this note

Please Login to reply.

Discussion

conduitという抽象を使ってコードを書いていて、その抽象だと前段で処理した内容を後段に渡していくわけだ。ここでは、その「前段」の部分がバイト列を続く処理にわたすのだけど、その前段の部分に「ビット単位」で値を渡す機能をつけるのも、「あり」と言えば「あり」だ。8の倍数でないビット数の情報を渡せるようにする、か。

でも、そのやりかただと2つ問題が出てくる。

1. 後段に渡すデータが単純なバイト列ではなくなる

2. もし1ビットずつ渡す形だと、毎回「バイトかビットか」「何個わたすか」をチェックするのが非効率

で2に関しては、ある程度大きいビット列を後段に渡して、それがそのビット列から1ビットずつ取り出して、次の処理に渡すというやりかたで問題ない。

後段に渡すデータが単純なバイト列ではなくなってしまう問題についてはどうしようかな。