通过gzip解压缩失败

时间:2015-01-17 07:14:17

标签: c# gzip

我写一对功能也压缩和解压缩但解压缩失败

这是我的代码

 public static byte[] CompressByGzip( byte[] input ) {
            using(var ims = new MemoryStream()) {
                using(var gzip = new GZipStream(ims, CompressionMode.Compress)) {
                    gzip.Write(input, 0, input.Length);
                    return ims.ToArray();
                }
            }
        }
  public static byte[] DecompressByGzip( byte[] input ) {
            using(var ims = new MemoryStream()) {
                using(var gzip = new GZipStream(ims, CompressionMode.Decompress)) {
                    using(var outms = new MemoryStream()) {
                        ims.Write(input, 0, input.Length);
                        byte[] buf = new byte[bufLength];
                        int len=0;
                        while((len=gzip.Read(buf, 0, buf.Length))>0) {
                            outms.Write(buf, 0, len);
                        }
                        return outms.ToArray();
                    }
                }
            }
        }

当我调试时,我发现gzip无法读取,它有内部异常.... 长度=“gzip.Length”引发了“System.NotSupportedException”类型的异常

2 个答案:

答案 0 :(得分:2)

您的压缩输出CompressByGzip错误。您需要在转换为数组之前刷新gzip流。移动return ...语句。

public static byte[] CompressByGzip( byte[] input ) 
{
   using(var ims = new MemoryStream()) 
   {
     using(var gzip = new GZipStream(ims, CompressionMode.Compress)) 
     {
        gzip.Write(input, 0, input.Length);
     }
     return ims.ToArray();
    }
 }

答案 1 :(得分:1)

以下是您可以为.Net 4.5做的事情

压缩

public static byte[] Compress(byte[] data, CompressionLevel level = CompressionLevel.Fastest)
{
    using (var memory = new MemoryStream())
    {
        using (var gzip = new GZipStream(memory, level, true))
        {
            gzip.Write(data, 0, data.Length);
        }
        return memory.ToArray();
    }
}

解压

public static byte[] Decompress(byte[] byteData)
{
    if (byteData == null)
        throw new ArgumentNullException("byteData", @"inputData must be non-null");

    using (var compressedMs = new MemoryStream(byteData))
    {
        using (var decompressedMs = new MemoryStream())
        {
            using (var gzs = new BufferedStream(new GZipStream(compressedMs, CompressionMode.Decompress), 4096))
            {
                gzs.CopyTo(decompressedMs);
            }
            return decompressedMs.ToArray();
        }
    }
}