是否可以在 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.compression
和DeflateStream
,但结果完全不一样。我现在正在为 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
写入文件即可。
我有一个 uncompressed file 已经在 Python 中用 Zlib 压缩了,我想压缩在 c# 中使用 Ionic.Zlib 并获得与 Python[= 完全相同的压缩输出文件63=]的。
我一开始用的是System.IO.compression
和DeflateStream
,但结果完全不一样。我现在正在为 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
写入文件即可。