0

DEFLATEアルゴリズムを通過したデータがいくつかあります。コマンドを実行すると、perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' < deflated_data.gz 正しい出力が出力されます。ただし、同じデータで次のコードを使用するとInvalidDataException、データを膨らませようとするとが表示されます。データが正しくない場所を表示するINFLATEの実装はありますか?

    public byte[] Inflate(byte[] inputData)
    {
        using (Stream input = new DeflateStream(new MemoryStream(inputData),
                                                CompressionMode.Decompress))
        {
            using (MemoryStream output = new MemoryStream())
            {
                input.CopyTo(output);
                return output.ToArray();
            }
        }
    }
4

1 に答える 1

3

これは互換性の問題ではなく、フォーマットを理解する上での問題です。ここでほのめかされる3つの形式があります:deflate(生の圧縮データ)、zlib(zlibヘッダーとトレーラーでラップされたdeflateデータ)、およびgzip(gzipヘッダーとトレーラーでラップされたdeflateデータ)。それらは、 RFC 1951RFC 1950、およびRFC1952にそれぞれ文書化されています。

Compress :: Zlib uncompress()関数は適切に文書化されており、uncompress()はzlib(RFC 1950)ストリームを予期していると述べています。.NET DeflateStreamクラスも適切に文書化されており、生のdeflateストリーム(RFC 1951)を期待しています。

「DEFLATEアルゴリズムを通過したデータがある」と言うとき、実際には、deflate形式ではなくzlib(RFC 1950)形式に圧縮したことを意味します。

于 2012-07-02T17:46:05.887 に答える