我有一个uncompressed file,已在 Python 中用 Zlib 压缩过,并想用 Ionic.Zlib 进行压缩在 c#中获取与 Python 完全相同的压缩输出文件。
起初我使用的是System.IO.compression
和DeflateStream
,但结果差得远。我现在正在将 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#)。
谢谢!
答案 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
写入文件。