原始压缩数据可以正确地退回。但是,如果我膨胀数据,放气并再次膨胀,结果数据是不正确的(例如,简单的数据提取,修改和再次压缩 - 仅在测试时不进行修改,所以我可以测试它。)
结果数据以某种方式“损坏”。起始(大约)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故障,而是我的。
答案 0 :(得分:1)
我知道这是一个切实的答案,但同样的事情发生在我身上,我放弃了SharpZipLib并去了DotNetZip:
http://dotnetzip.codeplex.com/
更简单的API,没有损坏或奇怪的字节顺序文件。