告诉我,对于 .NET Framework 4.6.1 及以下版本,在 C# 中是否有正常的zlib实现?面临文本压缩的问题。该算法的GitHub上的算法的zlib实现的任何测试版本都正常将字节数组解包为文本,但打包后与原始版本相比,前2个字节的字节数组不同,最后还有大约 6 个字节,这最终使它在后续解包时被破坏。同时,在 Java 版本中,一切正常。打包后的文字与拆包和打包前的原件完全一致。换句话说,以具有打包文本的字节数组为例,在解包和打包操作后,我无法使用 .NET 工具在输出中获得相同的字节数组。
测试表单代码:
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
using Test_Compression.utils;
using zlib;
namespace Test_Compression
{
public partial class Form1 : Form
{
// Source code of ZLIB
// http://www.componentace.com/zlib_.NET.htm
public Form1()
{
InitializeComponent();
}
private void buttonRun_Click(object sender, EventArgs e)
{
byte[] source = File.ReadAllBytes("original.bin");
string sourceHex = HexUtil.printData(source);
this.richTextBox1.Text = sourceHex;
byte[] TextBlock;
DecompressData(source, out TextBlock);
string text = Encoding.Default.GetString(TextBlock);
this.richTextBox3.Text = text;
byte[] CompressedBlock;
CompressData(TextBlock, out CompressedBlock);
string compressedHex = HexUtil.printData(CompressedBlock);
this.richTextBox2.Text = compressedHex;
}
public static void CompressData(byte[] inData, out byte[] outData)
{
using (MemoryStream outMemoryStream = new MemoryStream())
using (ZOutputStream outZStream = new ZOutputStream(outMemoryStream, zlibConst.Z_DEFAULT_COMPRESSION))
using (Stream inMemoryStream = new MemoryStream(inData))
{
CopyStream(inMemoryStream, outZStream);
outZStream.finish();
outData = outMemoryStream.ToArray();
}
}
public static void DecompressData(byte[] inData, out byte[] outData)
{
using (MemoryStream outMemoryStream = new MemoryStream())
using (ZOutputStream outZStream = new ZOutputStream(outMemoryStream))
using (Stream inMemoryStream = new MemoryStream(inData))
{
CopyStream(inMemoryStream, outZStream);
outZStream.finish();
outData = outMemoryStream.ToArray();
}
}
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[2000];
int len;
while ((len = input.Read(buffer, 0, buffer.Length)) > 0)
output.Write(buffer, 0, len);
output.Flush();
}
private void buttonClear_Click(object sender, EventArgs e)
{
this.richTextBox1.Clear();
this.richTextBox2.Clear();
this.richTextBox3.Clear();
}
}
}
我附上一个项目来检查开箱和打包。
我阅读了zlib 说明并意识到您根本没有
Z_SYNC_FLUSH
.也就是这里是解决方法,需要在压缩的时候指定
结果是:
但是当然这个图书馆很奇怪。顺便说一下,您可以不通过手动连接,而是将其安装为 NuGet 包,它在那里称为zlib.net。
顺便说一句,这就是我们在完全没有第三方库的情况下为 .NET 7 设法实现的目标。
ZLibStream
自 BCL 中的 .NET 6 以来,该类就可用了。结论是这样的
可以看出是不一样的,但是打包解包都妥妥的。据我了解,这是由于 zlib 中 deflate 算法的实现版本不同所致。这有点不被认为是一个问题,因为解包器的工作在任何地方都是一样的,唯一的区别在于打包器。