2016-12-01 31 views
5

Tôi cần phải nén một mảng byte. Vì vậy, tôi đã viết đoạn này:Sử dụng Gzip để nén/giải nén một mảng byte

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(); 
      } 
     } 
    } 

Vấn đề là tôi nhận được kết quả này:

output

Tôi không hiểu tại sao kích thước của mảng nén lớn hơn một giải nén!

Bất kỳ ý tưởng nào?

Sửa

sau khi bình luận @ tiêu pha của: nếu tôi thay đổi test chuỗi ví dụ:

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

tôi nhận được kết quả khác nhau. Vậy kích thước tối thiểu của mảng ban đầu sẽ được nén là bao nhiêu?

+2

Bởi vì dữ liệu là quá nhỏ mà các chi phí chung của định dạng nén lớn hơn những lợi ích nén. Thử thêm dữ liệu. Lưu ý: dữ liệu hoàn toàn ngẫu nhiên sẽ không nén. – spender

+0

@spender plz xem chỉnh sửa của tôi và đăng ý tưởng của bạn dưới dạng câu trả lời, cảm ơn –

Trả lời

1

Tệp nén có tiêu đề và nó làm tăng kích thước tệp, khi kích thước đầu vào rất nhỏ, đầu ra có thể lớn hơn nhiều như bạn thấy. hãy thử nó với một tệp có kích thước lớn hơn.

1

Điều này là do lượng dữ liệu quá nhỏ nên chi phí đầu vào của định dạng nén lớn hơn mức tăng của nén.

Thử thêm dữ liệu.

Nếu bạn nén toàn bộ dữ liệu ngẫu nhiên (hoặc đã nén dữ liệu như jpeg), bạn sẽ không bao giờ đạt được bất kỳ mức tăng đáng kể nào. Tuy nhiên, chuỗi new String('*',1000000) sẽ nén xuống thực sự độc đáo.

GZIP thêm ít nhất 18 byte, vì vậy, bất kỳ thứ gì bên dưới hoặc nhỏ hơn kích thước này dễ nén sẽ không được hưởng lợi.

Dưới đây là một câu hỏi thú vị mà thăm dò sâu hơn vào GZIP: What's the most that GZIP or DEFLATE can increase a file size?