SharpZipLib Deflater создает плохие данные - PullRequest
0 голосов
/ 07 июля 2011

Исходные сжатые данные могут быть правильно завышены обратно.Однако, если я раздуваю данные, раздуваю и снова раздуваю, получающиеся в результате данные неверны (например, простое извлечение данных, их модификация и повторное сжатие - только сейчас, когда тестирование не происходит, поэтому я могу его проверить).

Полученные данные как-то «повреждены».Начальные (около) 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 Ответ

1 голос
/ 07 июля 2011

Я знаю, что это тангенциальный ответ, но точно такая же вещь произошла со мной, я отказался от SharpZipLib и перешел к DotNetZip:

http://dotnetzip.codeplex.com/

Более простой API, без искажений или странностейфайлы порядка байтов.

...