【发布时间】:2014-09-01 01:02:20
【问题描述】:
我使用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_takeover 和 server_no_context_takeover 选项,让对方知道我们没有回收放气状态。
那么我怎样才能更改上面的代码,以便为下一次调用保留放气“状态”?
【问题讨论】:
-
您能否在内存流仍在压缩器中打开时从内存流中读取,而不是将其转换为数组?
-
@speising 我想是的。但是在您调用 Close() 之前,压缩器不会将任何内容刷新到内存流中。
-
这是一个微优化,违背了当前所有向 WebSockets 添加压缩的提议。所有坏主意之母。
-
@HansPassant Chrome 预计“permessage-deflate”默认使用这种压缩,我只是想遵循他们的标准。
标签: c# compression gzip zlib deflate