Zlib Deflate的“同步刷新”

时间:2010-11-28 16:02:47

标签: c# zlib flush deflate deflatestream

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

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

阅读zlib flush modes,看起来好像我需要一种特定的模式。

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

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

它确实只在关闭时冲洗。您每次都需要使用不同的DeflateStream实例,将 true 传递给overloaded constructor,告诉它关闭底层流当你关闭DeflateStream时。

答案 2 :(得分: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);