使用 SharpZipLib 解压缩 zlib 压缩数据

时间:2020-12-29 19:00:32

标签: c# zlib sharpziplib

我正在查看以下 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, 0, 2047);
if (ret == 0)
{
    Console.WriteLine(inflater.IsNeedingDictionary);
    Console.WriteLine(inflater.IsNeedingInput);
    Console.WriteLine(inflater.Adler);
}

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

进行比较

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