2009-05-13 1 views
3

Я не понимаю. Я использовал один и тот же подход уже много лет и никогда не испытывал этого.1 или более байтов усечения с GZip в оба конца

По какой-то причине, что я не добирался до сегодняшнего дня, поездка в оба конца GZip приводит к усечению 1 или более байтов или искажению данных.

Я написал простой тест, чтобы проверить, что что-то еще не влияет на него.

Это всегда происходит с несоответствием длины.

Может ли кто-то соответствовать мне, что я не сумасшедший? :)

Благодаря

leppie

TEST

using System; 
using System.Diagnostics; 
using System.IO; 
using System.IO.Compression; 

class Program 
{ 
    const int BUFFER_SIZE = 8192; 

    static void Main(string[] args) 
    { 
    var filename = args[0]; 
    var filedata = File.ReadAllBytes(filename); 
    var cmp = Compress(filedata); 
    var dec = Decompress(cmp); 

    Assert(filedata, dec); 

    Console.ReadLine(); 
    } 

    static void Assert(byte[] orig, byte[] data) 
    { 
    if (orig.Length != data.Length) 
    { 
     Debug.Fail("length mismatch"); 
    } 
    for (int i = 0; i < orig.Length; i++) 
    { 
     Debug.Assert(orig[i] == data[i], "data mismatch"); 
    } 
    } 

    static byte[] Compress(byte[] data) 
    { 
    var input = new MemoryStream(data); 
    var output = new MemoryStream(); 

    var s = new GZipStream(output, CompressionMode.Compress); 
    byte[] buffer = new byte[BUFFER_SIZE]; 
    int read = 0; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     s.Write(buffer, 0, read); 
    } 

    return output.ToArray(); 
    } 

    static byte[] Decompress(byte[] data) 
    { 
    var input = new MemoryStream(data); 
    var s = new GZipStream(input, CompressionMode.Decompress); 

    var output = new MemoryStream(); 
    byte[] buffer = new byte[BUFFER_SIZE]; 
    int read = 0; 
    while ((read = s.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, read); 
    } 

    return output.ToArray(); 
    } 
} 

Я попытался его закрыть потоки должным образом тоже, с различными размерами буфера, все тот же результат.

ответ

3

ОК, нашел проблему.

Перед извлечением байтов вам необходимо закрыть поток сжатия.

Например:

s.Close(); 
return output.ToArray(); 
Смежные вопросы