zlib的deflate函数接受一个Z_FULL_FLUSH选项作为它的参数,据我所知,当执行全刷新时,将设置一个全刷新点(0,0,0xFF,0xFF),随后的数据将独立于该点之前的字节,从而使压缩数据可以准随机访问。我读了一点dictzip的源代码,它利用这个特性实现了分块的随机可访问性,同时保持了与gzip的兼容性。我想使用CLR提供的功能重新实现dictzip压缩器/解压缩器。解压缩器(随机部分阅读器)很简单,我可以使用DeflateStream逐块地解压缩数据块,没有问题,但是对于创建,有一个巨大的障碍,DeflateStream的API太高了,似乎所有的泄气细节都被隐藏了,因此无法利用。我真的不喜欢在我的C#项目中包含一个C共享库,这会使跨平台部署变得非常痛苦,而且从一开始就取消了选择C#编码的好处。那么,我该怎么做呢?有没有什么方法可以仅仅使用托管代码来绕过这个障碍?Mono是否为zlib提供了较低级别的包装器,以便我可以使用full flush选项调用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!发布于 2012-11-27 02:59:22
试试DotNetZip。所以我不会让我发表少于30个字符的帖子,即使这是一个完整和正确的答案,所以我添加了这个无关的句子。
https://stackoverflow.com/questions/13560131
复制相似问题