4

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!
4

1 に答える 1

2

DotNetZipをお試しください。完全で正解ですが、30文字未満の投稿は許可されないので、この無関係な文を追加しました。

于 2012-11-26T18:59:21.863 に答える