nptclのブログ

Common Lisp処理系nptの開発メモです。https://github.com/nptcl/npt

DEFLATEの展開コードを作る

1. はじめに

C言語でDEFLATEという圧縮アルゴリズムの展開コードを作りました。
ただし次の二点において問題があるためお勧めできません。

  • zlibに比べるととても遅い
  • 圧縮はまだ作ってない

でも放置すると忘れるのでgithubに登録しました。
自分自身が忘れないためにも周知します。

配布はここです。

https://github.com/nptcl/hypd/tree/main/develop/deflate

2. DEFLATEとはなにか

あまり詳しく説明する気はないのでさらっと行きます。
gzipで使われている、圧縮のアルゴリズムです。
lz77とかハフマン符号とか使われています。
今回配布しているコードでは、それらと真っ向から向き合っています。

RFCで仕様が公開されている所がとてもいいと思います。

https://www.ietf.org/rfc/rfc1951.txt

今回は日本語の翻訳をフルで活用させていただきました。

CGI Perl 専門サイト - futomi's CGI Cafe
RFC 1951 DEFLATE Compressed Data Format Specification version 1.3 日本語訳
https://www.futomi.com/lecture/japanese/rfc1951.html

ありがとうございました!

3. 見どころ

見どころはインターフェイスでしょうか。
展開(あとは一応圧縮も)の構造体に、 入力と出力のバッファを合わせて2つ持っており、 必要になったらバッファの入力と出力をお願いするような形になっています。
簡易的なストリームを作ったことになるので、 まあまあどんな状況にでも使うことができるような感じなのではないでしょうか。

詳しくはそのうち話すかもしれませんが、 今はやる気がないので例を見てくださいでごまかします。

4. そのうちやりたいこと

もう少し展開を早くできると思うのでやりたいです。

あと、圧縮コードは絶対作ります。
いまのコードで圧縮しようとすると、一応DEFLATE形式で生成はするのですが、 何も圧縮しないでそのまま出力するモードで行われます。
DEFLATE(しぼむ)なのにINFLATE(ふくらむ)してしまいます。
面白いですね!!