SharpZipLib Deflater会创建错误的数据

时间:2011-07-06 21:52:26

标签: c# deflate sharpziplib

原始压缩数据可以正确地退回。但是,如果我膨胀数据,放气并再次膨胀,结果数据是不正确的(例如,简单的数据提取,修改和再次压缩 - 仅在测试时不进行修改,所以我可以测试它。)

结果数据以某种方式“损坏”。起始(大约)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故障,而是我的。

1 个答案:

答案 0 :(得分:1)

我知道这是一个切实的答案,但同样的事情发生在我身上,我放弃了SharpZipLib并去了DotNetZip:

http://dotnetzip.codeplex.com/

更简单的API,没有损坏或奇怪的字节顺序文件。