4

保守的なタイトルと質問自体で大変申し訳ありませんが、迷っています。

ICsharpCode.ZipLib で提供されるサンプルには、探しているものが含まれていません。byte[] を 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();
    }

line(size = stream.Read(writeData, 0, writeData.Length);) で、無効なヘッダーがあるという例外をスローします。

私の質問は、関数を修正する方法ではありません。この関数はライブラリに付属していません。グーグルで見つけただけです。私の質問は、関数がInflaterStreamで行うのと同じ方法で例外なく解凍する方法です。

ありがとうございます - 控えめな質問で申し訳ありません。

4

3 に答える 3

3

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();
    }
于 2013-12-12T13:59:23.447 に答える
1

データが不適切であるように思えますが、それ以外の場合、コードは問題なく機能します。Close(確かに、明示的に呼び出す代わりに、ストリームに「using」ステートメントを使用します。)

どこからデータを取得しましたか?

于 2009-04-12T11:19:00.670 に答える
1

System.IO.Compression.DeflateStream クラス (.Net 2.0 以降で利用可能) を使用しないのはなぜですか? これは同じ圧縮/解凍方法を使用しますが、追加のライブラリ依存関係は必要ありません。

.Net 2.0 以降、ファイル コンテナーのサポートが必要な場合は、ICSharpCode.ZipLib のみが必要です。

于 2009-04-12T11:23:58.630 に答える