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

C# 如何在多个数据块上使用DeflateStream?,c#,compression,gzip,zlib,deflate,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)) {

我使用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客户端\u no\u上下文\u接管和服务器\u no\u上下文\u接管选项,让另一方知道我们没有循环使用deflate状态


那么,我如何更改上面的代码,使其为下一次调用保留deflate“state”

您的代码已经实现了“using”,它在方法返回时处理所有对象。因此,您不能在不同的调用之间维护“状态”


尝试在方法之外维护对compressor和compressStream的引用。

您的代码已经实现了“使用”,它在方法返回时处理所有对象。因此,您不能在不同的调用之间维护“状态”


尝试在方法之外维护对compressor和compressStream的引用。

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

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

将生成压缩流的内容。在下一次写入之前,请小心定位到末尾!当然,如前所述,您必须使对象保持活动状态。

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

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

将生成压缩流的内容。在下一次写入之前,请小心定位到末尾!当然,如前所述,您必须使对象保持活动状态。

我知道,但在这种情况下这不会有帮助,因为您必须在读取结果之前调用DeflateStream上的Close,因此在类级别保留引用似乎毫无意义。我知道,但在这种情况下这没有帮助,由于在读取结果之前必须对deflatestStream调用Close,因此将引用保留在类级别似乎毫无意义。是否可以在内存流仍在压缩器中打开时从内存流中读取,而不是将其转换为数组?@speising我认为可以。但在调用Close之前,压缩器不会将任何内容刷新到memorystream。这是一个微观优化,与当前所有向WebSocket添加压缩的建议背道而驰。坏主意之母。@HansPassant Chrome希望“permessage deflate”默认使用这种压缩方式,我只是想遵循他们的标准。你能在内存流还在压缩器中打开时读取它,而不是将其转换为数组吗?@speising我想可以。但在调用Close之前,压缩器不会将任何内容刷新到memorystream。这是一个微观优化,与当前所有向WebSocket添加压缩的建议背道而驰。所有坏主意之母。@HansPassant Chrome期望“permessage deflate”默认使用这种压缩,我只是想遵循他们的标准。不是这样吗?我已经尝试过这段代码,在关闭压缩器之前,压缩流中没有可用的字节?不是这样吗?我已经尝试过这段代码,在关闭压缩器之前,压缩流中没有可用的字节?