2008-09-16 18 views

उत्तर

9

MSDN से System.IO.Compression.GZipStream के बारे में:

इस वर्ग gzip डेटा स्वरूप है, जो दोषरहित फ़ाइल संपीड़न और विसंपीड़न के लिए एक उद्योग मानक एल्गोरिथ्म का उपयोग करता प्रतिनिधित्व करता है।

zlib FAQ से

: zlib में दूसरी ओर

GZ * कार्यों gzip प्रारूप का उपयोग करें।

तो zlib और GZipStream अंतःक्रियाशील होना चाहिए, लेकिन केवल अगर आप gzip-format को संभालने के लिए zlib फ़ंक्शंस का उपयोग करते हैं।

System.IO.Compression.Deflate और zlib कथित रूप से अंतःक्रियाशील नहीं हैं।

यदि आपको ज़िप फ़ाइलों को संभालने की आवश्यकता है (आप शायद नहीं करते हैं, लेकिन किसी और को इसकी आवश्यकता हो सकती है) तो आपको SharpZipLib या किसी अन्य तृतीय-पक्ष लाइब्रेरी का उपयोग करने की आवश्यकता है।

+1

ज़िप फ़ाइलें zlib-compressed फ़ाइलों के समान नहीं हैं (संपीड़न एल्गोरिदम समान हो सकता है, लेकिन शीर्षलेख नहीं हैं) –

+0

आप सही हैं। मैं अपनी प्रतिक्रिया संपादित करूंगा। –

+21

पुन: ज़्लिब और डिफ्लेटस्ट्रीम के संबंध में "रिपोर्ट नहीं किया गया है"। वे वास्तव में अंतःक्रियाशील नहीं हैं। इस जगह को कवर करने वाले तीन आईईटीएफ आरएफसी हैं: जेएलआईबी के लिए 1 9 50, डेफलेट के लिए 1 9 51 और जीजेआईपी के लिए 1 9 52। Deflate संपीड़न एल्गोरिदम है। जेएलआईबी और जीजेआईपी अलग-अलग प्रारूप हैं, जो मेटाडेटा, उर्फ ​​"हेडर" को परिभाषित करते हैं, जो संपीड़ित स्ट्रीम पर लागू होते हैं। ज़्लिब लाइब्रेरी ZLIB और GZIP दोनों लागू करता है। इसे दिलचस्प बनाने के लिए, ZLIB और GZIP दोनों को संपीड़न तंत्र के रूप में DEFLATE का उपयोग कर सकते हैं। DeflateStream वर्ग एक नंगे, हेडरलेस स्ट्रीम पैदा करता है। इसमें कोई आश्चर्य की बात नहीं है कि हम सभी उलझन में हैं। – Cheeso

2

वे सिर्फ zlib या डिफ्लेट एल्गोरिदम का उपयोग कर डेटा को संपीड़ित करते हैं, लेकिन कुछ विशिष्ट फ़ाइल प्रारूप के लिए आउटपुट प्रदान नहीं करते हैं। इसका अर्थ यह है कि यदि आप हार्ड ड्राइव के रूप में स्ट्रीम को स्टोर करते हैं तो शायद आप इसे कुछ एप्लिकेशन (gzip या winrar) का उपयोग करके खोलने में सक्षम नहीं होंगे क्योंकि फ़ाइल हेडर (जादू संख्या, आदि) स्ट्रीम में शामिल नहीं हैं उन्हें खुद लिखो।

0

मैं एंड्रियास से सहमत हूं। आप शायद बाहरी उपकरण में फ़ाइल को खोलने में सक्षम नहीं होंगे, लेकिन यदि वह टूल स्ट्रीम की अपेक्षा करता है तो आप इसका उपयोग कर सकते हैं। आप एक ही संपीड़न वर्ग का उपयोग कर फ़ाइल को वापस डिफ्लेट करने में सक्षम होंगे।

3

gzip डिफ्लेट + कुछ हेडर/पाद लेख डेटा, जैसे चेकसम और लंबाई आदि। इसलिए वे इस अर्थ में संगत नहीं हैं कि एक विधि दूसरे से स्ट्रीम का उपयोग कर सकती है, लेकिन वे एक ही संपीड़न एल्गोरिदम को नियोजित करते हैं।

6

मैंने .NET XmlSerializer से आउटपुट को संपीड़ित करने के लिए GZipStream का उपयोग किया है और यह परिणाम गनज़िप (साइगविन में), winzip और अन्य GZipStream के साथ परिणाम को कम करने के लिए पूरी तरह से ठीक काम किया है।

FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write); 
using (GZipStream gzStream = new GZipStream(fs, CompressionMode.Compress)) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(MyDataType)); 
    serializer.Serialize(gzStream, myData); 
} 

फिर, सी #

FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read); 
using (Stream input = new GZipStream(fs, CompressionMode.Decompress)) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(MyDataType)); 
    myData = (MyDataType) serializer.Deserialize(input); 
} 

में संपीड़ित 'फ़ाइल' उपयोगिता का प्रयोग cygwin का पता चलता है में वास्तव में के बीच एक अंतर है कि वहाँ:

संदर्भ के लिए, मैं क्या कोड में किया था है GZipStream के साथ संपीड़ित वही फ़ाइल और जीएनयू जीज़िप के साथ (शायद हेडर जानकारी अन्य लोगों ने इस धागे में कहा है)। हालांकि, यह अंतर अभ्यास में कोई फर्क नहीं पड़ता।

+1

आकर्षण की तरह काम करता है! प्रदर्शन डेटा के लिए उपयोग किए जाने वाले बड़े डेटासेट को 55 एमबी से केवल 7.5 एमबी तक संकुचित किया गया है, बिना किसी प्रदर्शन के नुकसान के। पीएस अगर "फ़ाइल" का नाम बदलकर "file.gz" कर दिया गया है, तो यह पूरी तरह से वैध संग्रह फ़ाइल बन जाता है। आप किसी भी संग्रह उपकरण का उपयोग करके अपनी सामग्री को भी संशोधित कर सकते हैं, और यह आपकी विधि का उपयोग करके deserializeable रहेगा। – Soonts

14

DotNetZip 1952 सब हवा निकालना एल्गोरिथ्म लेकिन तैयार करने और हैडर बाइट का उपयोग हर एक के लिए अलग हैं आरएफसी 1950, 1951 को संभालने के लिए, एक DeflateStream, एक ZlibStream, और एक GZipStream शामिल हैं।

लाभ के रूप में, डॉटनेटेट में धाराएं anomaly of expanding data size को संपीड़न के तहत प्रदर्शित नहीं करती हैं, अंतर्निहित धाराओं के खिलाफ रिपोर्ट की गई है।इसके अलावा, कोई अंतर्निहित ज़्लिबस्ट्रीम नहीं है, जबकि डॉटनेटजिप आपको ज़्लिब के साथ अच्छे इंटरऑप के लिए देता है।

12

मैं गिट ऑब्जेक्ट्स के साथ इस मुद्दे में भाग गया। उस विशेष मामले में, वे वस्तुओं को ज़्लिब हेडर के साथ डिफ्लेटेड ब्लब्स के रूप में संग्रहीत करते हैं, जिसे RFC 1950 में प्रलेखित किया गया है। तुम एक फ़ाइल है कि बनाकर एक संगत ब्लॉब बना सकते हैं: 0x78 0x01

  • CM = 8 = हवा निकालना मूल्यों के साथ

    • दो हैडर बाइट्स (सीएमएफ और FLG आरएफसी 1950 से)
    • CINFO = 7 = 32 केबी खिड़की
    • इस हेडर
  • के उत्पादन के लिए
  • FCHECK = 1 = चेकसम बिट्स सी # DeflateStream
  • एक Adler32 DeflateStream, बड़े endian प्रारूप करने के लिए इनपुट डेटा की जांच योग (MSB पहले)

मैं अपने खुद के एडलर कार्यान्वयन

public class Adler32Computer 
{ 
    private int a = 1; 
    private int b = 0; 

    public int Checksum 
    { 
     get 
     { 
      return ((b * 65536) + a); 
     } 
    } 

    private static readonly int Modulus = 65521; 

    public void Update(byte[] data, int offset, int length) 
    { 
     for (int counter = 0; counter < length; ++counter) 
     { 
      a = (a + (data[offset + counter])) % Modulus; 
      b = (b + a) % Modulus; 
     } 
    } 
} 

बनाया और वह ज्यादा यह बहुत था ।

1

.NET Framework 4.5 से शुरू System.IO.Compression.DeflateStream कक्षा zlib लाइब्रेरी का उपयोग करती है।

से वर्ग के MSDN article:

इस वर्ग Deflate एल्गोरिथ्म, जो दोषरहित फ़ाइल संपीड़न और विसंपीड़न के लिए एक उद्योग की मानक एल्गोरिथ्म है प्रतिनिधित्व करता है। .NET Framework 4.5 से शुरू होने पर, DeflateStream क्लास zlib लाइब्रेरी का उपयोग करता है। नतीजतन, यह एक बेहतर संपीड़न एल्गोरिदम प्रदान करता है और, ज्यादातर मामलों में, यह एक छोटी संकुचित फ़ाइल है जो .NET Framework के पुराने संस्करणों में प्रदान करता है।

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