GZip декомпрессия останавливается в произвольной точке - PullRequest
2 голосов
/ 20 октября 2010

Я использую класс .Net GZipStream для сжатия и распаковки файлов. После того, как я произвожу декомпрессию, данные кажутся нормальными, но затем превращаются в нули, кроме нулей после определенной, казалось бы, произвольной точки. Например, после распаковки файла его размер составляет 19 КБ, но все байты 10 588 и далее равны нулю.

Я не уверен, что делаю неправильно.

Вот как я делаю сжатие:

Byte[] bytes = GetFileBytes(file);

using (FileStream fileStream = new FileStream("Zipped.gz", FileMode.Create))
{
    using (GZipStream zipStream = new GZipStream(fileStream, CompressionMode.Compress))
    {
        zipStream.Write(bytes, 0, bytes.Length);
    }
}

И вот как я выполняю распаковку (Bytes - это массив сжатых байтов, а OriginalSize - размер файла до его сжатия):

using (MemoryStream memoryStream = new MemoryStream(Bytes))
{
    using (GZipStream zipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
    {
        // Note: Since the compressed version can be larger, I use the larger of the original and the compressed size for the decompressed array's size.
        Byte[] decompressedBytes = new Byte[OriginalSize > Bytes.Length ? OriginalSize : Bytes.Length];

        Int32 numRead = zipStream.Read(decompressedBytes, 0, Bytes.Length);

        using (FileStream fileStream = new FileStream("Decompressed.txt", Name), FileMode.Create))
        {
            fileStream.Write(decompressedBytes, 0, Convert.ToInt32(OriginalSize));
        }
    }
}

1 Ответ

3 голосов
/ 20 октября 2010

Я вижу здесь потенциальную ошибку: вы делаете предположения! :) При копировании между потоками нужно использовать цикл, см. этот вопрос

...