2016-12-01 14 views
5

मुझे बाइट्स की एक सरणी को संपीड़ित करने की आवश्यकता है। तो मैं इस टुकड़ा लिखा है:बाइट्स की एक सरणी को संपीड़ित/डिकंप्रेस करने के लिए Gzip का उपयोग

output

मुझे समझ नहीं आता क्यों संकुचित सरणी के आकार decompressed एक से अधिक है:

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

समस्या यह है कि मैं इस आउटपुट प्राप्त है!

कोई विचार?

संपादित

@ खर्चा करने की टिप्पणी के बाद: अगर मैं उदाहरण के लिए test स्ट्रिंग बदलने के लिए:

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

मैं अलग परिणाम मिलता है। तो संकुचित होने के लिए प्रारंभिक सरणी का न्यूनतम आकार क्या है?

+2

क्योंकि डेटा इतना छोटा है कि संपीड़न प्रारूप का ओवरहेड्स संपीड़न के लाभ पल्ला झुकना:

यहाँ एक दिलचस्प सवाल है कि GZIP में आगे की जांच करता है। अधिक डेटा आज़माएं। नोट: पूरी तरह यादृच्छिक डेटा संपीड़ित नहीं होगा। – spender

+0

@spender plz मेरा संपादन देखें और अपना विचार उत्तर के रूप में पोस्ट करें, धन्यवाद –

उत्तर

1

संपीड़ित फ़ाइल में हेडर हैं और यह फ़ाइल आकार बढ़ाता है, जब इनपुट आकार बहुत छोटा होता है तो आउटपुट जितना बड़ा हो सकता है उतना बड़ा हो सकता है। इसे बड़े आकार वाले फ़ाइल के साथ आज़माएं।

1

ऐसा इसलिए है क्योंकि डेटा की मात्रा इतनी छोटी है कि संपीड़न प्रारूप के ऊपरी भाग संपीड़न के लाभ से अधिक हैं।

अधिक डेटा आज़माएं।

यदि आप पूरी तरह से यादृच्छिक डेटा (या पहले से संकुचित डेटा जैसे जेपीईजी) को संपीड़ित करते हैं, तो आप कभी भी कोई महत्वपूर्ण लाभ नहीं उठाएंगे। हालांकि स्ट्रिंग new String('*',1000000) वास्तव में अच्छी तरह से संपीड़ित हो जाएगी।

जीजेआईपीपी कम से कम 18 बाइट जोड़ता है, इसलिए नीचे कुछ भी, या इस आकार से थोड़ा सा आसानी से संपीड़ित है, इससे लाभ नहीं होगा। What's the most that GZIP or DEFLATE can increase a file size?

संबंधित मुद्दे