Как использовать ICSharpCode.ZipLib с потоком? - PullRequest
4 голосов
/ 12 апреля 2009

Мне очень жаль консервативное название и сам мой вопрос, но я потерян.

Примеры, предоставляемые с ICsharpCode.ZipLib, не включают в себя то, что я ищу. Я хочу распаковать байт [], поместив его в InflaterInputStream (ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream)

Я нашел функцию распаковки, но она не работает.

    public static byte[] Decompress(byte[] Bytes)
    {
        ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream stream =
            new ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream(new MemoryStream(Bytes));
        MemoryStream memory = new MemoryStream();
        byte[] writeData = new byte[4096];
        int size;

        while (true)
        {
            size = stream.Read(writeData, 0, writeData.Length);
            if (size > 0)
            {
                memory.Write(writeData, 0, size);
            }
            else break;
        }
        stream.Close();
        return memory.ToArray();
    }

Он выдает исключение в строке (size = stream.Read (writeData, 0, writeData.Length);), говоря, что у него недопустимый заголовок.

Мой вопрос не в том, как исправить функцию, эта функция не поставляется с библиотекой, я просто нашел ее googling.Мой вопрос, как распаковать так же, как функция делает с InflaterStream, но без исключений.

Спасибо и еще раз - извините за консервативный вопрос.

Ответы [ 3 ]

3 голосов
/ 12 декабря 2013

код в Lucene очень хороший.

public static byte[] Compress(byte[] input) {
        // Create the compressor with highest level of compression  
        Deflater compressor = new Deflater();
        compressor.SetLevel(Deflater.BEST_COMPRESSION);

        // Give the compressor the data to compress  
        compressor.SetInput(input);
        compressor.Finish();

        /* 
         * Create an expandable byte array to hold the compressed data. 
         * You cannot use an array that's the same size as the orginal because 
         * there is no guarantee that the compressed data will be smaller than 
         * the uncompressed data. 
         */
        MemoryStream bos = new MemoryStream(input.Length);

        // Compress the data  
        byte[] buf = new byte[1024];
        while (!compressor.IsFinished) {
            int count = compressor.Deflate(buf);
            bos.Write(buf, 0, count);
        }

        // Get the compressed data  
        return bos.ToArray();
    }

    public static byte[] Uncompress(byte[] input) {
        Inflater decompressor = new Inflater();
        decompressor.SetInput(input);

        // Create an expandable byte array to hold the decompressed data  
        MemoryStream bos = new MemoryStream(input.Length);

        // Decompress the data  
        byte[] buf = new byte[1024];
        while (!decompressor.IsFinished) {
            int count = decompressor.Inflate(buf);
            bos.Write(buf, 0, count);
        }

        // Get the decompressed data  
        return bos.ToArray();
    }
1 голос
/ 12 апреля 2009

Почему бы вам не использовать класс System.IO.Compression.DeflateStream (доступен с .Net 2.0)? При этом используется тот же метод сжатия / распаковки, но не требуется дополнительная зависимость от библиотеки.

Начиная с .Net 2.0 вам нужен только ICSharpCode.ZipLib, если вам нужна поддержка файлового контейнера.

1 голос
/ 12 апреля 2009

Похоже, данные просто неуместны, и в противном случае код будет работать нормально. (По общему признанию, я бы использовал оператор "using" для потоков вместо явного вызова Close.)

Откуда вы взяли свои данные?

...