我正在尝试通过DeflateStream在.NET中利用充气压缩流。我的代码抛出了一个InvalidDataException,尽管我知道我传递的数据已经被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;
}发布于 2012-07-02 22:09:17
不,你不是。
这段代码有问题:
Close(),而不是使用using语句。在这里可能不是有害的,但这是一个坏主意。Stream.Read的返回值
假设你使用的是.NET 4(用于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 --就我个人而言,在这一点上我不会这么做,但这样做可能是有意义的。(如果有必要,我会在调用端捕获它。如有必要,您始终可以将此方法包装在另一个方法中。)
https://stackoverflow.com/questions/11295300
复制相似问题