如何在多个数据块上使用DeflateStream?

时间:2014-09-01 01:02:20

标签: c# compression gzip zlib deflate

我使用DeflateStream这样实现了Websocket压缩:

    public byte[] Compress(Stream input)
    {
        using (var compressStream = new MemoryStream())
        using (var compressor = new DeflateStream(compressStream, CompressionMode.Compress))
        {
            input.CopyTo(compressor);
            compressor.Close();

            return compressStream.ToArray();
        }
    }

这适用于第一条消息,但是我需要保持相同的压缩上下文(LZ77滑动窗口)并将其重新用于第二条消息,而不是每次都使用新的字典。

我目前的解决方法是设置Websockets client_no_context_takeoverserver_no_context_takeover选项,让对方知道我们没有回收deflate状态。

那么如何更改上面的代码,以便为下次调用保留deflate'state'?

2 个答案:

答案 0 :(得分:0)

您的代码已实现'using',它在方法返回时处理所有对象。因此,您无法在不同的呼叫之间保持“状态”。

尝试在方法之外维护对compressorcompressStream的引用。

答案 1 :(得分:-1)

您实际上可以在不关闭压缩器的情况下从MemoryStream读取:

input.CopyTo(compressor);
compressStream.Position = 0;
var mem2 = new BinaryReader(compressStream);
mem2.Read(buf, 0, 10000000);

将产生compressStream的内容。在下次写作之前,要小心定位到最后! (当然,如前所述,你必须让你的物品保持活力)。