gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:31:25 28 4
gpt4 key购买 nike

zlib 的 deflate 函数接受一个 Z_FULL_FLUSH 选项作为它的参数,据我所知,当执行 full flush 时,一个 full flush point (0,0,0xFF,0xFF ) 将被设置,后续数据将独立于该点之前的字节,因此使压缩数据准随机访问。我读了一点 dictzip 的来源,它利用这个特性来实现它的 block 随机可访问性,同时保持与 gzip 的兼容性。我想使用 CLR 提供的功能重新实现 dictzip 压缩器/解压缩器。解压器(random parts reader)很简单,我用DeflateStream一个 block 一个 block 地解压数据就可以了,没问题,但是创建起来有很大的障碍,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!

最佳答案

尝试 DotNetZip . SO 不允许我发布少于 30 个字符,即使这是一个完整且正确的答案,所以我添加了这个无关的句子。

关于c# - 有没有办法强制 DeflateStream 完全刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13560131/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com