Проблемы с потоком распаковки .net gzip - PullRequest
1 голос
/ 26 апреля 2009

Что может быть не так с этим набором методов?

        byte[] bytes;

        using (var memory_stream = new MemoryStream())
        using (var gzip_stream = new GZipStream(memory_stream, CompressionMode.Compress))
        {
            var buffer = Encoding.Default.GetBytes("Hello nurse!");
            gzip_stream.Write(buffer, 0, buffer.Length);
            bytes = memory_stream.ToArray();
        }

        int total_read = 0;

        using (var input_stream = new MemoryStream(bytes))
        using (var gzip_stream = new GZipStream(input_stream, CompressionMode.Decompress, true))
        {
            int read;
            var buffer = new byte[4096];
            while ((read = gzip_stream.Read(buffer, 0, buffer.Length)) != 0) {
                total_read += read;
            }
        }

        Debug.WriteLine(bytes);
        Debug.WriteLine(total_read);

gzipStr - это действительный поток Gzipped (я могу успешно сжать его с помощью GzipStream () Compress).

Почему total_read всегда равен 0 ??? gzip stream распаковывает мой поток? я делаю что-то не так?

Что я здесь не так делаю ??? *

1 Ответ

2 голосов
/ 26 апреля 2009

Вы забыли сбросить. :) Обратите внимание, что Encoding.Default обычно не следует использовать в производстве. В приведенном ниже тексте замените его на Encoding.UTF8 (или что угодно). Наконец, конечно, приведенная ниже проверка santiy работает, только если все помещается в один буфер. Но теперь вы должны понять.

Кементеус указал, что мой предыдущий код здесь не помог, поэтому ниже приведен точный код, который я использовал:

public class GzipBug
{
    public static void Main(String[] a)
    {
        byte[] bytes;
    byte[] buffer;

    Encoding encoding = Encoding.UTF8;

        using (var memory_stream = new MemoryStream())
        using (var gzip_stream = new GZipStream(memory_stream, CompressionMode.Compress))
        {
            buffer = encoding.GetBytes("Hello nurse!");
            gzip_stream.Write(buffer, 0, buffer.Length);
        gzip_stream.Flush();
        bytes = memory_stream.ToArray();
        }

        int total_read = 0;

        using (var input_stream = new MemoryStream(bytes))
        using (var gzip_stream = new GZipStream(input_stream, CompressionMode.Decompress, true))
        {
        int read;
            buffer = new byte[4096];
            while ((read = gzip_stream.Read(buffer, 0, buffer.Length)) != 0) {
        total_read += read;
            }
        }

        Debug.WriteLine(encoding.GetString(buffer, 0, total_read));
        Debug.WriteLine(total_read);

    }
}

Он составлен из: gmcs -d: DEBUG -langversion: linq -debug + GzipBug.cs и запустить как: MONO_TRACE_LISTENER = Console.Out GzipBug.exe

(вы можете удалить бит MONO_TRACE_LISTENER)

...