ZLIB.net (.NET) 字节数组膨胀后归零(随机工作)
ZLIB.net (.NET) zeros after inflating a byte array (randomly working)
我对 Deflate 算法的行为感到困惑,例如,第一个字节块(大小 12~13k)总是解压成功。但是第二次解压一直没成功..
我正在使用带有简单代码的 DotNetZip (DeflateStream),后来我切换到 ZLIB.Net(组件 ace)、Org.Bouncycastle 和各种 c# 库。
The compression goes in c++ (the server that sends the packets) with deflateInit2, windowSize (-15) -> (15 - nowrap).
尽管解压成功,但我在缓冲区末尾出现零的原因可能是什么?
a example code with "Org.BouncyCastle.Utilities.Zlib"
it's pretty much the same code for almost any lib (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;
}
为确保一切正常,您应该检查以下内容:
- 两个 zlib 版本在双方(压缩 - 服务器,解压 - 客户端)上匹配。
- 刷新模式设置为同步,这意味着缓冲区必须同步才能解压缩服务器发送的更多数据包。
- 确保您收到的数据包实际上是正确的,在我的具体情况下,我附加了一个不同的数组大小(实际上是一个常数,0xFFFF),它可能与接收到的数据的大小不同(这在大多数情况下都会发生)。
[编辑 19 年 11 月 13 日']
请记住,如果两者都有刷新类型为同步的合同,那么服务器可能不会发送最后 4 个字节(同步 00 00 ff ff),因此请注意手动添加它们。
我对 Deflate 算法的行为感到困惑,例如,第一个字节块(大小 12~13k)总是解压成功。但是第二次解压一直没成功..
我正在使用带有简单代码的 DotNetZip (DeflateStream),后来我切换到 ZLIB.Net(组件 ace)、Org.Bouncycastle 和各种 c# 库。
The compression goes in c++ (the server that sends the packets) with deflateInit2, windowSize (-15) -> (15 - nowrap).
尽管解压成功,但我在缓冲区末尾出现零的原因可能是什么?
a example code with "Org.BouncyCastle.Utilities.Zlib"
it's pretty much the same code for almost any lib (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;
}
为确保一切正常,您应该检查以下内容:
- 两个 zlib 版本在双方(压缩 - 服务器,解压 - 客户端)上匹配。
- 刷新模式设置为同步,这意味着缓冲区必须同步才能解压缩服务器发送的更多数据包。
- 确保您收到的数据包实际上是正确的,在我的具体情况下,我附加了一个不同的数组大小(实际上是一个常数,0xFFFF),它可能与接收到的数据的大小不同(这在大多数情况下都会发生)。
[编辑 19 年 11 月 13 日']
请记住,如果两者都有刷新类型为同步的合同,那么服务器可能不会发送最后 4 个字节(同步 00 00 ff ff),因此请注意手动添加它们。