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

时间:2019-07-14 23:44:59

标签: c# python compression zlib

我有一个uncompressed file,已在 Python 中用 Zlib 压缩过,并想用 Ionic.Zlib 进行压缩在 c#中获取与 Python 完全相同的压缩输出文件。

起初我使用的是System.IO.compressionDeflateStream,但结果差得远。我现在正在将 Ionic.Zlib 库用于 c#,并越来越接近我的目标,但是某些字节仍然不同(或很多字节,具体取决于文件)。

这是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),压缩头(前2个字节)相同。接下来的3个字节似乎也相同(EC 7D 0B),然后其余部分实际上取决于输入的未压缩文件... The first one我尝试压缩的只有2个字节,这4个字节之间是不同的最后字节:**6E A5** 55 53 Python )与**6C 02** 55 53 c#)。

谢谢!

1 个答案:

答案 0 :(得分:0)

对于想知道如何在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写入文件。