【问题标题】:ZLIB.net (.NET) zeros after inflating a byte array (randomly working)ZLIB.net (.NET) 在膨胀字节数组后归零(随机工作)
【发布时间】:2019-05-22 04:15:50
【问题描述】:

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

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

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

尽管解压成功,但有什么可能导致缓冲区末尾出现零?

带有“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) 压缩步骤中是否缺少刷新导致输出被截断? 2)既然您提到了“发送数据包的服务器”,那么“压缩”是否已通过网络发送?你有没有仔细检查过它没有被截断/修改?
  • 嗯,1. 数据传输正确(因为这种压缩实际上是可选的,在我的例子中,它由数据包头中的 4 个字节标识) 2. 数据压缩正确吗?是的,因为它在 actionscript 3 (ByteArray.inflate) 中运行良好
  • 所以,我终于明白了,FlushMode 是 Sync。但是,我仍然无法解压缩数据,它显示“状态不佳(存储块长度无效)”

标签: c# bouncycastle zlib dotnetzip


【解决方案1】:

为确保一切正常,您应该检查以下内容:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2016-09-04
    相关资源
    最近更新 更多