原始压缩数据可以正确膨胀回来。但是,如果我膨胀数据,放气,再膨胀,结果数据是不正确的(例如简单的数据提取,修改和再次压缩 - 只有现在测试时没有修改发生,所以我可以测试它)。
结果数据以某种方式“损坏”。开始(大约)40 个字节是可以的,然后是错误数据的“块”(原始数据的残余仍然存在,但丢失了许多字节)。
更改压缩级别无济于事(设置 NO_COMPRESSION 会以某种方式创建不完整的流)。
问题很简单:为什么会这样?
using ICSharpCode.SharpZipLib.Zip.Compression;
public byte[] Inflate(byte[] inputData)
{
Inflater inflater = new Inflater(false);
using (var inputStream = new MemoryStream(inputData))
using (var ms = new MemoryStream())
{
var inputBuffer = new byte[4096];
var outputBuffer = new byte[4096];
while (inputStream.Position < inputData.Length)
{
var read = inputStream.Read(inputBuffer, 0, inputBuffer.Length);
inflater.SetInput(inputBuffer, 0, read);
while (inflater.IsNeedingInput == false)
{
var written = inflater.Inflate(outputBuffer, 0, outputBuffer.Length);
if (written == 0)
break;
ms.Write(outputBuffer, 0, written);
}
if (inflater.IsFinished == true)
break;
}
inflater.Reset();
return ms.ToArray();
}
}
public byte[] Deflate(byte[] inputData)
{
Deflater deflater = new Deflater(Deflater.BEST_SPEED, false);
deflater.SetInput(inputData);
deflater.Finish();
using (var ms = new MemoryStream())
{
var outputBuffer = new byte[65536 * 4];
while (deflater.IsNeedingInput == false)
{
var read = deflater.Deflate(outputBuffer);
ms.Write(outputBuffer, 0, read);
if (deflater.IsFinished == true)
break;
}
deflater.Reset();
return ms.ToArray();
}
}
编辑:我的错,我错误地重写了原始压缩数据的前几个字节。这不是 SharpZipLib 的错,而是我的错。