使用GZipStream对MemoryStream进行编程压缩/解压缩

时间:2011-06-14 22:14:06

标签: c# .net c#-4.0 c#-3.0 gzip

我构建了(基于CodeProject文章)一个包装类(C#),使用 GZipStream 来压缩 MemoryStream 。它压缩很好但不会减压。我看了很多其他有相同问题的例子,我觉得我跟着说的是什么,但是当我解压缩时仍然没什么。这是压缩和解压缩方法:

public static byte[] Compress(byte[] bSource)
{

    using (MemoryStream ms = new MemoryStream())
    {
        using (GZipStream gzip = new GZipStream(ms, CompressionMode.Compress, true))
        {
            gzip.Write(bSource, 0, bSource.Length);
            gzip.Close();
        }

        return ms.ToArray();
    }
}


public static byte[] Decompress(byte[] bSource)
{

    try
    {
        using (MemoryStream ms = new MemoryStream())
        {
            using (GZipStream gzip = new GZipStream(ms, CompressionMode.Decompress, true))
            {
                gzip.Read(bSource, 0, bSource.Length);
                gzip.Close();
            }

            return ms.ToArray();
        }
    }
    catch (Exception ex)
    {
        throw new Exception("Error decompressing byte array", ex);
    }
}

以下是我如何使用它的示例:

string sCompressed = Convert.ToBase64String(CompressionHelper.Compress("Some Text"));
// Other Processes
byte[] bReturned = CompressionHelper.Decompress(Convert.FromBase64String(sCompressed));
// bReturned has no elements after this line is executed

2 个答案:

答案 0 :(得分:7)

解压缩方法存在错误。

代码不会读取bSource的内容。相反,它覆盖了从空gzip读取的内容,这是基于空的内存流创建的。

基本上你的代码版本在做什么:

//create empty memory
using (MemoryStream ms = new MemoryStream())

//create gzip stream over empty memory stream
using (GZipStream gzip = new GZipStream(ms, CompressionMode.Compress, true))

// write from empty stream to bSource
gzip.Write(bSource, 0, bSource.Length);

修复可能如下所示:

public static byte[] Decompress(byte[] bSource)
{
    using (var inStream = new MemoryStream(bSource))
    using (var gzip = new GZipStream(inStream, CompressionMode.Decompress))
    using (var outStream = new MemoryStream())
    {
        gzip.CopyTo(outStream);
        return outStream.ToArray();
    }
}

答案 1 :(得分:1)

OP在编辑中说,现在回滚:

感谢Alex对出现问题的解释,我能够修复Decompress方法。不幸的是,我使用.Net 3.5,所以我无法实现他建议的Stream.CopyTo方法。但是,通过他的解释,我能够找到解决方案。我对下面的解压缩方法进行了适当的更改。

    public static byte[] Decompress(byte[] bSource)
    {
        try
        {
            using (var instream = new MemoryStream(bSource))
            {
                using (var gzip = new GZipStream(instream, CompressionMode.Decompress))
                {
                    using (var outstream = new MemoryStream())
                    {
                        byte[] buffer = new byte[4096];

                        while (true)
                        {
                            int delta = gzip.Read(buffer, 0, buffer.Length);

                            if (delta > 0)
                                outstream.Write(buffer, 0, delta);

                            if (delta < 4096)
                                break;
                        }
                        return outstream.ToArray();
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw new Exception("Error decompressing byte array", ex);
        }
    }
相关问题