sileのブログsileのブログ読者になるsileのブログこの広告は、90日以上更新していないブログに表示しています。algorithmgzip圧縮/解凍器作成の3。今回は、この内のLZ77による圧縮(及び解凍)を扱う。LZ77まず、RFC1951内でLZ77の要旨について言及している箇所を引用する。種類の連続要素から構成されます。入力バイトの中に複製されたと検出されなかったストリングの)文字バイトと、複製されたストリングへのポインターです。して表現されるものです。バイトまでに制限されています。Cafeこれだけでは分かりにくいので少し補足しつつLZ77アルゴリズムをまとめてみると、多分次のようになる。重複がある場合は、その分のデータを(重複するデータ長)、戻る距離(現在位置-重複検出位置)>で置き換える例えば、"abc123abc456"という文字列の場合は、"abc123<3,6>456"と置換されることになる残りのデータを走査し、同様の処理を行うこれに加えて、DEFLATEの場合は長さが最大258バイト(※最小は3バイト)、戻り距離が最大32Kバイトという制限がある。これを実装したのが以下のコード。encoded-listの前に続くデータ。私《わたくし》はその人を常に先生と呼んでいた。ここでもただ先生と書くだけで本名は打ち明けない。これは世間を憚《はば》かる遠慮というよりも、その方が私にとって自然だからである。私はその人の記憶を呼び起すごとに、すぐ「先生」といいたくなる。筆を執《と》っても心持は同じ事である。一<5,-10><22,-253>。ここでもただ<3,-18>書くだけで本名は打ち明けない。これは世間を憚《はば》かる遠慮というよりも、その方が私にとって自然<3,-60>である。私<4,-84>の記憶を呼び起すごとに、すぐ「先生」といいたくなる。500文字を対象にした場合、要素数的には約65%に圧縮されているDEFLATE用コード列に変換ここまででLZ77の基本的な実装は終了したが、DEFLATEで利用するには、さらにlz77:encode関数の結果を加工し整数列に変換する必要がある。(長さ・距離コード)」)を参照してもらうとして、ここではそのためのコードだけを載せておくことにする。codesには、256(ブロック終端を示すコード)は含まれないことが前提。234288以上で、DEFLATEのLZ77に関する実装は(ほぼ)終了。関数追加DEFLATE処理用の便利関数をいくつか追加。読者になる広告を非表示にする関連記事2011-08-07ユニコード文字列をバイトストリームとして扱うためのパッケージタイトル通りのパッケージ。