微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 SharpZipLib 解压缩 zlib 压缩数据

如何解决使用 SharpZipLib 解压缩 zlib 压缩数据

我正在查看以下 C++ 代码行,其中包含“zlib.h”

int err = compress2(compressed.get(),&dest_len,reinterpret_cast<const unsigned char *>(plain_text.c_str()),source_len,9);

我正在尝试使用 C# 撤消此压缩。我认为我应该使用 C# 库,因为编写自己的解压缩算法似乎既浪费又困难。 我似乎推荐的库是 SharpZipLib(甚至是 Mark Adler 本人!) 但是,带有这些参数的 compress2 似乎正在使用预设字典。这是我解压的尝试:

Inflater inflater = new Inflater(false);
inflater.SetInput(bytes);
int ret = inflater.Inflate(outBuffer,2047);
if (ret == 0)
{
    Console.WriteLine(inflater.IsNeedingDictionary);
    Console.WriteLine(inflater.IsNeedingInput);
    Console.WriteLine(inflater.Adler);
}

这表示它需要一本字典。我知道如何设置字典,但我对如何根据 zlib.h 压缩函数设置它一无所知。 如何创建必要的预设字典来解密?

注意事项: 这是我试图在 C# 中基本上复制的代码

int err = uncompress(uncompressed.get(),plain_text.get(),src_len);

uncompressed 是空的,dest len 就是 4*src_len,src_len 是压缩长度。存储在纯文本中的压缩文本。

这是在我的 C# 程序中检测到的前 2 个字节: 78 3f (0111 1000 0011 1111)

有人表示,鉴于给定的 compress2 代码,这没有意义...

抱歉我的问题有任何错误,我没有在这里问很多问题。

解决方法

不,compress2() 不使用字典。您的数据可能不会完好无损。您应该在问题中以十六进制形式放置您尝试解压缩的前几个字节,如在 C# 方面所见。

,

如果有人尝试使用 zlib 中的 compress2,并尝试在 C# 中处理此输入,请注意您如何接收压缩数据。 Compress2() 使用预设字典。

具体来说,请确保前 2 个字节有意义。我对奇怪的第二个字节不屑一顾,因为第一个字节是正确的,但真正阅读它并与 RFC 1950

进行比较

有很多方法可以正确读取字节,但我的错误是尝试使用 Encoding.Ascii.GetBytes 读取它们。不要那样做!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。