chipz decompression libraryには非常に便利な機能があります。は、提供されたストリームから読み取られたデータを透過的に解凍するためのインターフェイス(舞台裏でグレーストリームを使用)を提供します。これにより、圧縮されたデータと圧縮されていないデータの両方で動作するCommon Lispのread
関数がストリームから単一のLisp "フォーム"を読み込むのと同じように、単一の関数read-tag
(構造化バイナリデータのストリームから単一の "タグ"例えば:Common Lispでデータを圧縮するストリームインターフェイス
;; For uncompressed data:
(read-tag in-stream)
;; For compressed data:
(read-tag (chipz:make-decompressing-stream 'chipz:zlib in-stream))
私の知る限り、関連する圧縮ライブラリ、salza2のAPIは、逆のタスクを実行するための(アウトオブボックス)同等のインターフェースを提供していません。どうやってこのようなインターフェースを自分で実装できますか?それをmake-compressing-stream
としましょう。それは私自身の補完的なwrite-tag
機能を使用し、読書のためのと同じ利点を提供します。(上記のリンク)salza2のマニュアルで
;; For uncompressed-data:
(write-tag out-stream current-tag)
;; For compressed data:
(write-tag (make-compressing-stream 'salza2:zlib-compressor out-stream)
current-tag)
、概要では、それは言う:「Salza2が作成するためのインタフェースを提供します圧縮されたオクテットデータは、ユーザ定義のコールバックに提供されます。このコールバックにより、圧縮されたオクテットデータは、オクテットに書き込むことができます。ストリーム、別のベクトルなどにコピーします。私の現在の目的では、zlibとgzip形式の圧縮が必要です。標準の圧縮器が提供されています。
私はそれを行うことができると思います:まず、 "タグ"オブジェクトをオクテットベクトルに変換し、次にsalza2:compress-octet-vector
を使用して圧縮し、第3に圧縮データを直接ファイルに書き込むコールバック関数を提供します。読んで、私は最初のステップはflexi-streams:with-output-to-sequence
- hereを参照して達成することができると思うが、私は本当にsalza2のソースを見ても、コールバック関数についてはよく分かりません。しかし、ここでは、1つのタグに任意の数の任意にネストされたタグを含めることができます。この構造の「リーフ」タグには、大きなペイロードがそれぞれ含まれています。言い換えれば、単一のタグは非常に多くのデータになる可能性があります。
tag-> uncompressed-octets-> compressed-octets->ファイル変換は、理想的にはチャンクで実行する必要があります。これにより、答えがわからないという質問が発生します。圧縮形式 - AIUI - ヘッダーにペイロードデータのチェックサムを格納する傾向があります。一度にデータを1つのチャンクに圧縮し、圧縮された各チャンクを出力ファイルに追加すると、タグ全体のデータの1つのヘッダーとチェックサムとは対照的に、各チャンクのヘッダーとチェックサムが確実に存在します。欲しいです?どうすればこの問題を解決できますか?それともsalza2ですでに処理されていますか?とりとめのない:)