我使用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
选项,让对方知道我们没有回收deflate状态。
那么如何更改上面的代码,以便为下次调用保留deflate'state'?
答案 0 :(得分:0)
您的代码已实现'using',它在方法返回时处理所有对象。因此,您无法在不同的呼叫之间保持“状态”。
尝试在方法之外维护对compressor
和compressStream
的引用。
答案 1 :(得分:-1)
您实际上可以在不关闭压缩器的情况下从MemoryStream
读取:
input.CopyTo(compressor);
compressStream.Position = 0;
var mem2 = new BinaryReader(compressStream);
mem2.Read(buf, 0, 10000000);
将产生compressStream
的内容。在下次写作之前,要小心定位到最后! (当然,如前所述,你必须让你的物品保持活力)。