gzip解压失败

decompress by gzip failed

我写了一对函数也压缩和解压但解压失败

这是我的代码

 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 无法读取,它有内部异常.... Length = “gzip.Length”引出了“System.NotSupportedException”类型的异常

您的压缩输出 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();
    }
 }

这是您可以为 .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();
        }
    }
}