1

を使用して、.NET で INFLATE 圧縮ストリームを利用しようとしていますDeflateStreamInvalidDataException渡すデータが DEFLATE アルゴリズムによって正しく処理されている (テスト済み) ことはわかっていますが、コードは をスローします。DeflateStreamを間違って使用していますか? 私のコードは次のとおりです。

public byte[] Inflate(byte[] deflateArr)
    {
        MemoryStream ms;

        // try to create a MemoryStream from a byte array
        try
        {
            ms = new MemoryStream(deflateArr);
        }
        catch (ArgumentNullException)
        {
            return null;
        }

        // create a deflatestream and pass it the memory stream
        DeflateStream ds;
        try
        {
            ds = new DeflateStream(ms, CompressionMode.Decompress);
        }
        catch (ArgumentNullException)
        {
            return null;
        }
        catch (ArgumentException)
        {
            return null;
        }

        // create a bytes array and read into it
        byte[] bytes = new byte[4096];

        try
        {
            ds.Read(bytes, 0, 4096);
        }
        catch (ArgumentNullException)
        {
            return null;
        }
        catch (InvalidOperationException)
        {
            return null;
        }
        catch (ArgumentOutOfRangeException)
        {
            return null;
        }
        catch (InvalidDataException)
        {
            return null;
        }

        // close the memory stream
        ms.Close();

        // close the deflate stream
        ds.Close();

        return bytes;
    }
4

1 に答える 1

5

いいえ、そうではありません。

このコードの問題点:

  • ステートメントClose()を使用する代わりに明示的に呼び出す。usingここではおそらく害はありませんが、悪い考えです。
  • プログラミングのバグを示すため、実際にはまったくキャッチしてはならないさまざまな例外をキャッチする
  • コード全体で例外を同じ方法で処理している場合でも、ステートメントごとに例外をキャッチします (したがって、はるかに大きなブロックの例外をキャッチできます)。
  • の戻り値を無視するStream.Read

.NET 4 ( for Stream.CopyTo)を使用していると仮定すると、より良いバージョンがあります。

public static 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();
        }
    }
}

個人的にはキャッチしたくないかもしれませんが、そうするのは理にかなっているかもしれません。(必要に応じて、呼び出し側でキャッチします。必要に応じて、このメソッドを別のメソッドでいつでもラップできます。)InvalidDataException

于 2012-07-02T14:09:17.290 に答える