4

我需要一个 zlib deflate 压缩流。在我的实现中,我必须在整个会话中使用单个流。在此会话期间,小块数据将通过压缩流。每次传递一个块时,它必须立即以压缩形式发送。

我的第一次尝试是使用 DeflateStream,但是当我发送第一个块时,它的压缩数据在我关闭流之前不会出现。

阅读有关zlib 刷新模式的信息,似乎有一种特定模式可以满足我的需要。

  1. 我是否使用正确的类(DeflateStream)进行 zlib 放气压缩?
  2. 如何启用“同步刷新”行为?
4

3 回答 3

2

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.
于 2010-11-28T19:41:05.837 回答
0

它确实只在关闭时刷新。您每次都需要使用不同的 DeflateStream 实例,将true传递给重载的构造函数,告诉它在关闭 DeflateStream 时不要关闭底层流。

于 2010-11-28T16:07:21.250 回答
0

要回答有关如何启用“同步刷新”行为的问题,您应该查看 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);
于 2017-03-17T03:33:42.417 回答