2016-12-01 134 views
5

我需要压缩一个字节数组。所以我写了这个片段:使用Gzip压缩/解压缩一个字节数组

class Program 
    { 
     static void Main() 
     { 
      var test = "foo bar baz"; 

      var compressed = Compress(Encoding.UTF8.GetBytes(test)); 
      var decompressed = Decompress(compressed); 
      Console.WriteLine("size of initial table = " + test.Length); 
      Console.WriteLine("size of compressed table = " + compressed.Length); 
      Console.WriteLine("size of decompressed table = " + decompressed.Length); 
      Console.WriteLine(Encoding.UTF8.GetString(decompressed)); 
      Console.ReadKey(); 
     } 

     static byte[] Compress(byte[] data) 
     { 
      using (var compressedStream = new MemoryStream()) 
      using (var zipStream = new GZipStream(compressedStream, CompressionMode.Compress)) 
      { 
       zipStream.Write(data, 0, data.Length); 
       zipStream.Close(); 
       return compressedStream.ToArray(); 
      } 
     } 

     static byte[] Decompress(byte[] data) 
     { 
      using (var compressedStream = new MemoryStream(data)) 
      using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress)) 
      using (var resultStream = new MemoryStream()) 
      { 
       zipStream.CopyTo(resultStream); 
       return resultStream.ToArray(); 
      } 
     } 
    } 

的问题是,我得到这样的输出:

output

我不明白,为什么在压缩数组的大小比解一个更大的!

任何想法?

编辑

@富豪的评论后:如果我改变例如test字符串:

var test = "foo bar baz very long string for example hdgfgfhfghfghfghfghfghfghfghfghfghfghfhg"; 

我得到不同的结果。那么要压缩的初始数组的最小大小是多少?

+2

因为数据是如此之小,压缩格式的开销大于压缩的增益。尝试更多数据。注意:完全随机的数据不会被压缩。 – spender

+0

@spender PLZ看到我的编辑并发布您的想法作为答案,谢谢 –

回答

1

压缩文件具有标题,它增加了文件大小,当输入大小非常小时,输出可能会更大,如您所见。尝试使用更大尺寸的文件。

1

这是因为数据量是如此之小,以致于压缩格式的开销大于压缩的增益。

尝试更多数据。

如果你完全压缩了随机数据(或者已经压缩过的数据,比如jpeg),那么你永远不会获得任何显着的增益。然而字符串new String('*',1000000)会非常好地压缩。

GZIP增加了至少18个字节,所以任何低于或略高于这个容易压缩的大小都不会受益。

这里有一个有趣的问题,进一步探讨了GZIP:What's the most that GZIP or DEFLATE can increase a file size?