我需要一个 zlib deflate 压缩流。在我的实现中,我必须在整个会话中使用单个流。在此会话期间,小块数据将通过压缩流。每次传递一个块时,它必须立即以压缩形式发送。
我的第一次尝试是使用 DeflateStream,但是当我发送第一个块时,它的压缩数据在我关闭流之前不会出现。
阅读有关zlib 刷新模式的信息,似乎有一种特定模式可以满足我的需要。
- 我是否使用正确的类(DeflateStream)进行 zlib 放气压缩?
- 如何启用“同步刷新”行为?
DotNetZip项目有一个子模块 Zlib,其中包含自己的 DeflateStream 实现。
此实现有另一个名为 FlushMode 的属性:
DeflateStream deflate = new DeflateStream(stream, CompressionMode.Compress);
deflate.FlushMode = FlushType.Sync;
deflate.Write (data, 0, data.Length);
//No call to deflate.Flush() needed, automatically flushed on every write.
它确实只在关闭时刷新。您每次都需要使用不同的 DeflateStream 实例,将true传递给重载的构造函数,告诉它在关闭 DeflateStream 时不要关闭底层流。
要回答有关如何启用“同步刷新”行为的问题,您应该查看 zlib 源代码中的 zpipe.c 示例。
将第 1 行替换为如下所示的第 2 行
Deflate()
每次输出缓冲区已满或输入缓冲区为空时将返回,同时向压缩流附加一个空的文字块,也称为“同步刷新”,除了最后是Z_FINISH
标志。
flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
flush = feof(source) ? Z_FINISH : Z_SYNC_FLUSH;
ret = deflate(&strm, flush);