zlibのdeflate関数はZ_FULL_FLUSH
、引数としてオプションを受け入れます。私が知る限り、フルフラッシュが実行されると、フルフラッシュポイント(0,0,0xFF,0xFF)
が設定され、後続のデータはそのポイントの前のバイトから独立しているため、圧縮データは準になります。ランダムにアクセス可能。dictzipのソースを少し読んだ、この機能を利用して、チャンクごとのランダムなアクセシビリティを実装しましたが、gzipとの互換性は維持していました。CLRが提供する機能を使用してdictzipコンプレッサー/デコンプレッサーを再実装したいと思います。デコンプレッサー(ランダムパーツリーダー)は簡単です。DeflateStreamを使用してデータをチャンクごとに解凍できますが、問題はありませんが、作成に関しては大きな障害があり、DeflateStreamのAPIは高レベルです。すべての収縮の詳細が隠されているように見えるため、悪用できません。C#プロジェクトにC共有ライブラリを含めるのは本当に好きではありません。クロスプラットフォームの展開が非常に面倒になり、そもそもC#でコーディングを選択するメリットが失われます。それで、私は何をすべきか?マネージコードを使用するだけでこの障害を回避する方法はありますか?フルフラッシュオプションでdeflateを呼び出すことができるように、Monoはzlibの低レベルラッパーを提供しますか?アドバイスをいただければ幸いです。
---> 8---
答えを提供してくれたMarkAdlerに感謝します。DotNetZip(具体的にはIonic.Zlib.DeflateStream)は、私が求めていた機能を正確にサポートしています。次の例は、それがどのように機能するかを示しています。
Encoding u8 = Encoding.UTF8;
byte[] s1 = u8.GetBytes("the quick brown fox "),
s2 = u8.GetBytes("jumps over the lazy dog!");
var ms = new MemoryStream(100);
var deflator = new DeflateStream(ms, CompressionMode.Compress, true);
deflator.FlushMode = FlushType.Full;
deflator.Write(s1, 0, s1.Length);
deflator.Flush();
var pos = ms.Position;//remember the full flush point
deflator.Write(s2, 0, s2.Length);
deflator.Dispose();
var inflator = new DeflateStream(ms, CompressionMode.Decompress);
ms.Position = pos;
byte[] buf = new byte[100];
inflator.Read(buf, 0, s2.Length);
Console.WriteLine(u8.GetString(buf));//output: jumps over the lazy dog!