开发者

SharpZipLib Deflater creates bad data

Original compressed data can be correctly inflated back. However, if I inflate data, deflate, and again inflate, resulting data are incorrect (e.g. simple data extraction, its modification and again compression - only now when testing no modification occurs, so I can test it).

Resulting data are somehow "damaged". The starting (about) 40 bytes are OK, and then "block" of incorrect data follows (remnants of original data are still there, but many bytes are missing).

Changing compression level doesn't help (except setting NO_COMPRESSION creates somehow incomplete stream).

Question is simple: why is that happening?

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())
    {
    开发者_JAVA百科    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();
    }
}

Edit: My bad, by mistake I rewrote first several bytes of the original compressed data. This isn't SharpZipLib fault, but mine.


I know this is a tangential answer, but the exact same thing happened to me, I abandoned SharpZipLib and went to DotNetZip :

http://dotnetzip.codeplex.com/

Easier API, no corrupt or strange byte order files.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜