扩充字节数组后ZLIB.net(.NET)为零(随机工作)

时间:2019-05-22 04:15:50

标签: c# bouncycastle zlib dotnetzip

我对Deflate算法的行为感到困惑,例如第一个字节块(大小为12〜13k)总是成功解压缩。但是第二次减压从来没有成功。

我使用带有简单代码的DotNetZip(DeflateStream),后来我切换到ZLIB.Net(组件ace),Org.Bouncycastle和各种c#库。

  

压缩使用deflateInit2,windowSize(-15)->(15-nowrap)在c ++(发送数据包的服务器)中进行。

可能发生了什么错误,因此尽管减压成功,但缓冲区的末尾还是有零?

  

带有“ Org.BouncyCastle.Utilities.Zlib”的示例代码
  几乎所有库(DotNetZip,ZLIB.Net等)的代码几乎相同。

internal static bool Inflate(byte[] compressed, out byte[] decompressed) 
{
    using (var inputStream = new MemoryStream(compressed))
    using (var zInputStream = new ZInputStream(inputStream, true))
    using (var outputStream = new MemoryStream()) 
    {
        zInputStream.CopyTo(outputStream);
        decompressed = outputStream.ToArray();
    }

    return true;
}

1 个答案:

答案 0 :(得分:0)

为确保一切正常,您应检查以下各项:

  • 两个zlib版本在两侧都匹配(压缩-服务器,解压缩-客户端)。
  • 刷新模式设置为同步,这意味着必须同步缓冲区才能解压缩服务器发送的其他数据包。
  • 确保您收到的数据包实际上是正确的,并且在我的特定情况下,我附加了一个不同的数组大小(实际上是一个常数,为0xFFFF),该大小可能与接收到的数据大小不同(并且在大多数情况下都会发生)。

[编辑11月13日19']
请记住,按照惯例,如果两个服务器都具有刷新类型为同步的约定,则服务器可能不会发送最后4个字节(sync 00 00 ff ff),因此请注意手动添加它们。