是否可以在 C# 中使用 Python 和 Ionic.Zlib 中的 Zlib 获取字节相同的压缩文件?

Is it possible to get byte identical compressed files with Zlib in Python and Ionic.Zlib in c#?

我有一个 uncompressed file 已经在 Python 中用 Zlib 压缩了,我想压缩在 c# 中使用 Ionic.Zlib 并获得与 Python[= 完全相同的压缩输出文件63=]的。

我一开始用的是System.IO.compressionDeflateStream,但结果完全不一样。我现在正在为 c# 使用 Ionic.Zlib 库并越来越接近我的目标,但有些字节仍然不同(或很多其中,取决于文件。

这是Python代码:

import zlib

def compress():
    with open("compressedFile.dat", "wb") as compressedFile:
        with open("fileToCompress.txt", "rb") as fileToCompress:
            data = fileToCompress.read()
        compressedData = zlib.compress(data, 9)
        compressedFile.write(compressedData)

这就是我在 C# 中编写的,以尝试获得相同的压缩输出文件:

using System;
using System.IO;
using Ionic.Zlib;

static class myClass{
    static void compress(){
        BinaryWriter compressedFile = new BinaryWriter(new FileStream("compressedFile.dat", FileMode.Create));
        var compressedData = Ionic.Zlib.ZlibStream.CompressBuffer(File.ReadAllBytes("fileToCompress.txt"));
        compressedFile.Seek(0, SeekOrigin.Begin);
        compressedFile.Write(compressedData);
    }

    static void Main(){
        compress();
    }
}

压缩级别相同 (9),两个压缩文件 (78 DA) 中的压缩 header(前 2 个字节)相同。接下来的 3 个字节似乎也相同(EC 7D 0B),然后其余的实际上取决于输入的未压缩文件...The first one 我试图压缩只有 2 个字节,这 4 个字节是不同的最后一个字节:**6E A5** 55 53 (Python) vs **6C 02** 55 53 (c#).

谢谢!

编辑:已解决 对于任何想知道如何在 c# 中获得与 Python 的 Zlib.compress 完全相同的压缩的人,请使用 zlibnet.

从 zlibnet 的 releases 之一获取 zlibnet.dll 并使用 ZLibNet.ZLibStream(<output stream>, CompressionMode.Compress, CompressionLevel.Level9) 将 CompressionLevel.Level9 更改为 [=78] 中使用的=].

示例:

MemoryStream memoryStream = new MemoryStream();
using(var compressor = new ZLibNet.ZLibStream(memoryStream, CompressionMode.Compress, CompressionLevel.Level9)){
    fileStream.CopyTo(compressor);
    compressor.Close();
}

您现在只需将 memoryStream 写入文件即可。

如果有人想知道如何在 c# 中获得与 Python 的 Zlib.compress 完全相同的压缩,请使用 zlibnet.

从 zlibnet 的 releases 之一获取 zlibnet.dll 并使用 ZLibNet.ZLibStream(<output stream>, CompressionMode.Compress, CompressionLevel.Level9) 将 CompressionLevel.Level9 更改为 Python.

示例:

MemoryStream memoryStream = new MemoryStream();
using(var compressor = new ZLibNet.ZLibStream(memoryStream, CompressionMode.Compress, CompressionLevel.Level9)){
    fileStream.CopyTo(compressor);
    compressor.Close();
}

您现在只需将 memoryStream 写入文件即可。