.Net zlib使用.Net 4.5进行扩充

根据MSDN的.Net 4.5 System.IO.Compression基于zlib。
我现在正在尝试将当前基于互操作的读取从非.NET服务器中的zlib放气流更改为基于BCL的实现。
我的实现看起来像这样:

var enc = new UTF8Encoding(); var readBytes = BufferSizeRaw; var outputBuffer = new byte[BufferSizeRaw]; var networkBuffer = _networkQueue.Take(); var ms = new MemoryStream(networkBuffer.InputBuffer, 0, networkBuffer.UsedLength); using (Stream stream = new DeflateStream(ms, CompressionMode.Decompress)) while (readBytes==BufferSizeRaw) { readBytes = stream.Read(outputBuffer, 0, outputBuffer.Length); stringBuffer+= enc.GetString(outputBuffer, 0, readBytes); } 

我在DeflateStream上第一次调用解压缩/读取时收到以下exception:

块长度与其补码不匹配

基于互操作的调用使用var result=inflate(ref zStyream, ZLibFlush.NoFlush;
有没有人尝试过相同或者看到代码中出错的原因或者我的结论是否有错误的理解? 我也尝试过截断前两个字节而没有任何运气。
前几个字节是20,202,177,13。

您尝试压缩的数据的前几个字节是什么?

您可能有要尝试解码的zlib,gzip或raw deflate数据。

顺便说一句,我强烈建议您使用DotNetZip的接口来zlib而不是NET 4.5(或任何版本的.NET)。 NET 4.5在该接口中有错误,微软宣称它们不会修复 (!)。

上面的答案是正确的,但在“为什么”上并不完全清楚。 原始ZLib流的前两个字节提供有关所用压缩类型的详细信息。 System.Io.Compression中的Microsoft的DeflateStream类不理解这些。 修复方法如下:

 using (MemoryStream ms = new MemoryStream(data)) { MemoryStream msInner = new MemoryStream(); // Read past the first two bytes of the zlib header ms.Seek(2, SeekOrigin.Begin); using (DeflateStream z = new DeflateStream(ms, CompressionMode.Decompress)) { z.CopyTo(msInner); 

在此示例中,数据是带有原始Zlib文件的Byte []。 将它加载到MemoryStream后,我们只需“搜索”前两个字节。

该post解释了如果您查看原始字节,Zlib标头的样子。

zlib标题是什么样的?

这是ProVega答案的修订版本,它将字节数组膨胀为一个字符串:

 using (var stream = new MemoryStream(bytes,2, bytes.Length - 2)) using (var inflater = new DeflateStream(stream, CompressionMode.Decompress)) using (var streamReader = new StreamReader(inflater)) { return streamReader.ReadToEnd(); }