在从套接字接收部分数据时,我很难理解ZlibStream
的某些行为。另一端是发送zlib数据的C ++服务器,我正在编写客户端。
以下是我不理解的一些行为:
using (var mm = new MemoryStream())
{
var z = new ZlibStream(mm, Ionic.Zlib.CompressionMode.Decompress);
var buf = new byte[64];
int read = z.Read(buf, 0, buf.Length); // 0 of course
mm.Write(test, 0, test.Length); // mm contains bytes
mm.Position = 0;
read = z.Read(buf, 0, buf.Length); // still 0?!
z = new ZlibStream(mm, Ionic.Zlib.CompressionMode.Decompress);
mm.Position = 0;
read = z.Read(buf, 0, buf.Length); // now read == 13
}
似乎一旦我从ZlibStream
做了一个不完整的阅读,它只是放弃了,不能再使用了。如果我收到足够的数据来进行读取,并且希望流可以帮助我,让我知道它已经完成非零读取并且我可以保持偏移量,这让我感到沮丧。流。
此外我发现,如果我重新创建ZlibStream
(听起来很愚蠢,可能很贵)我的实现类型的工作,除了我永远不能调整MemoryStream
中的内容,它的长度会越来越长。成功读取后截断(SetLength(0)
)仅用于销毁压缩字典(我理解协议是有状态的),我不能再解码任何其他消息。
那么我做错了什么?