有没有办法强制DeflateStream完全刷新?

时间:2012-11-26 07:05:47

标签: c# zlib deflate

zlib的deflate函数接受Z_FULL_FLUSH选项作为参数,据我所知,当执行完全刷新时,将设置完整的刷新点(0,0,0xFF,0xFF),后续数据将是独立的从该点之前的字节开始,因此使得压缩数据准随机可访问。我已经阅读了dictzip的一些来源,它利用这个功能来实现其chunk-wise random-accessibility,同时保持与gzip的兼容性。我想使用CLR提供的功能重新实现dictzip压缩器/解压缩器。解压缩器(随机部分阅读器)很简单,我可以使用DeflateStream按块解压缩数据块,没有问题,但是对于创建,存在一个巨大的障碍,DeflateStream的API太高级了,似乎所有的收缩细节都是隐藏的,因此是不可利用的。我真的不喜欢在我的C#项目中包含一个C共享库,这使得跨平台部署非常痛苦,并且取消了首先在C#中选择编码的好处。所以我该怎么做?有什么办法可以仅使用托管代码来规避这个障碍吗? Mono是否为zlib提供了一个较低级别的包装器,以便我可以使用完全刷新选项调用deflate?任何建议将不胜感激!

---> 8 ---

感谢Mark Adler提供了答案。 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!

1 个答案:

答案 0 :(得分:2)

试试DotNetZip。所以不会让我发布不到30个字符,即使这是一个完整而正确的答案,所以我添加了这个无关紧要的句子。