Java DeflaterInputStream и DeflaterOutputStream для C#
Подскажите, есть ли нормальная реализация zlib в C# для .NET Framework 4.6.1 и ниже? Столкнулся с проблемой компрессии текста. Любая из испробованных версий реализации zlib алгоритма с GitHub этого алгоритма распаковывает байт массив в текст нормально, но после упаковки в сравнении с оригиналом байт массив в первых 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();
}
}
}
Проект для проверки распаковки и упаковки прилагаю.