C# 相当于 zlib.decompress

C# equivalent to zlib.decompress

C# 中的 Python 函数 zlib.decompress() 等效于什么?我需要使用 C# 解压一些 zlib 文件,但我不知道该怎么做。

Python 示例:

import zlib

file = open("myfile", mode = "rb")
data = zlib.decompress(file.read())
uncompressed_output = open("output_file", mode = "wb")
uncompressed_output.write(data)

我尝试使用 System.IO.Compression.DeflateStream class,但对于我尝试的每个文件,它都会给我一个异常,即文件在解码时包含无效数据。

byte[] binary = new byte[1000000];
using (DeflateStream compressed_file = new DeflateStream(new FileStream(@"myfile", FileMode.Open, FileAccess.Read), CompressionMode.Decompress))
       compressed_file.Read(binary, 0, 1000000); //exception here
using (BinaryWriter outputFile = new BinaryWriter(new FileStream(@"output_file", FileMode.Create, FileAccess.Write)))
       outputFile.Write(binary);

//Reading the file like normal with a BinaryReader and then turning it into a MemoryStream also didn't work

我应该提一下,这些文件是 ZLIB 压缩文件。他们从 78 9C header.

开始

所以,幸运的是,我找到了这个 post:

基本上文件必须去掉它的 2 个头字节 (78 9C)。虽然9C在解压方面很重要(它指定是否使用了预设词典),但我不需要它,但我很确定修改它以适应它并不难:

byte[] binary, decompressed;
using (BinaryReader file = new BinaryReader(new FileStream(@"myfile", FileMode.Open, FileAccess.Read, FileShare.Read))
    binary = file.ReadBytes(int.MaxValue); //read the entire file
output = new byte[int.MaxValue];
int outputSize;
using (MemoryStream memory_stream = new MemoryStream(binary, false))
{
    memory_stream.Read(decompressed, 0, 2); //discard 2 bytes
    using (DeflateStream compressed_file = new DeflateStream(memory_stream, CompressionMode.Decompress)
        outputSize = compressed_file.Read(decompressed, 0, int.MaxValue);
}
binary = new byte[outputSize];
Array.Copy(decompressed, 0, binary, 0, outputSize);
using (BinaryWriter outputFile = new BinaryWriter(new FileStream(@"output_file", FileMode.Create, FileAccess.Write)))
    outputFile.Write(binary);