compression - Zlib, gzip और ज़िप संबंधित कैसे हैं? उनके पास आम बात क्या है और वे अलग कैसे हैं?




(4)

Zlib में प्रयुक्त संपीड़न एल्गोरिदम अनिवार्य रूप से gzip और ज़िप में समान हैGzip और ज़िप क्या हैं? वे कैसे अलग हैं और वे कैसे समान हैं?


Answers

सबसे महत्वपूर्ण अंतर यह है कि gzip केवल एक फ़ाइल को संपीड़ित करने में सक्षम है जबकि ज़िप एकाधिक फ़ाइलों को एक-एक करके संपीड़ित करता है और बाद में उन्हें एक फ़ाइल में संग्रहीत करता है। इस प्रकार, gzip ज्यादातर समय के साथ आता है (हालांकि अन्य संभावनाएं हैं)। यह कुछ (डी) फायदे के साथ आता है।
यदि आपके पास एक बड़ा संग्रह है और आपको केवल एक फ़ाइल की आवश्यकता है, तो आपको उस फ़ाइल पर जाने के लिए पूरी gzip फ़ाइल को डिकंप्रेस करना होगा। यदि आपके पास ज़िप फ़ाइल है तो यह आवश्यक नहीं है।
दूसरी तरफ, यदि आप 10 समान या यहां तक ​​कि समान फ़ाइलों को संपीड़ित करते हैं, तो ज़िप संग्रह बहुत बड़ा होगा क्योंकि प्रत्येक फ़ाइल को व्यक्तिगत रूप से संपीड़ित किया जाता है, जबकि gzip में टैर के साथ संयोजन में एक फ़ाइल को संपीड़ित किया जाता है जो फाइलें अधिक प्रभावी होती हैं समान (बराबर)।


संक्षिप्त रूप:

.zip आमतौर पर डिफ्लेट संपीड़न विधि का उपयोग करके एक संग्रह प्रारूप है.gz gzip प्रारूप एकल फ़ाइलों के लिए है, Deflate संपीड़न विधि का भी उपयोग कर रहा है। अक्सर एक संपीड़ित संग्रह प्रारूप , .tar.gz बनाने के लिए टैर के साथ संयोजन में gzip का उपयोग किया जाता है। Zlib लाइब्रेरी ज़िप, gzip, png (जो डिफ्लेट डेटा पर zlib wrapper का उपयोग करता है) द्वारा उपयोग के लिए डिफ्लेट संपीड़न और डिकंप्रेशन कोड प्रदान करता है, और कई अन्य अनुप्रयोगों।

लंबा फार्म:

ज़िप प्रारूप को फिल कैटज़ द्वारा खुले विनिर्देश के साथ एक खुले प्रारूप के रूप में विकसित किया गया था, जहां उनका कार्यान्वयन, पीकेजेआईपी, शेयरवेयर था। यह एक संग्रह प्रारूप है जो फाइलों और उनकी निर्देशिका संरचना को संग्रहीत करता है, जहां प्रत्येक फ़ाइल व्यक्तिगत रूप से संपीड़ित होती है। फ़ाइल प्रकार .zip । फाइलें, साथ ही निर्देशिका संरचना, वैकल्पिक रूप से एन्क्रिप्टेड हो सकती हैं।

ज़िप प्रारूप कई संपीड़न विधियों का समर्थन करता है:

0 - The file is stored (no compression)
1 - The file is Shrunk
2 - The file is Reduced with compression factor 1
3 - The file is Reduced with compression factor 2
4 - The file is Reduced with compression factor 3
5 - The file is Reduced with compression factor 4
6 - The file is Imploded
7 - Reserved for Tokenizing compression algorithm
8 - The file is Deflated
9 - Enhanced Deflating using Deflate64(tm)
10 - PKWARE Data Compression Library Imploding (old IBM TERSE)
11 - Reserved by PKWARE
12 - File is compressed using BZIP2 algorithm
13 - Reserved by PKWARE
14 - LZMA (EFS)
15 - Reserved by PKWARE
16 - Reserved by PKWARE
17 - Reserved by PKWARE
18 - File is compressed using IBM TERSE (new)
19 - IBM LZ77 z Architecture (PFS)
97 - WavPack compressed data
98 - PPMd version I, Rev 1

1 से 7 तरीके ऐतिहासिक हैं और उपयोग में नहीं हैं। 9 से 98 के तरीके अपेक्षाकृत हालिया जोड़ हैं, और अलग-अलग हैं, छोटी मात्रा में उपयोग में हैं। ज़िप प्रारूप में वास्तव में व्यापक रूप से उपयोग में एकमात्र तरीका विधि 8, डिफ्लेट , और कुछ छोटी सीमा विधि 0 है, जो बिल्कुल संपीड़न नहीं है। वस्तुतः प्रत्येक .zip फ़ाइल जो आप जंगली में आ जाएंगे, विशेष रूप से विधि 8 और 0 का उपयोग करेगी, संभवतः केवल विधि 8 (विधि 8 के पास डेटा को प्रभावी रूप से बिना संपीड़न और अपेक्षाकृत कम विस्तार के डेटा को स्टोर करने का माध्यम है, और विधि 0 नहीं कर सकता स्ट्रीम किया जा सकता है जबकि विधि 8 हो सकता है।)

फ़ाइल कंटेनर के लिए आईएसओ / आईईसी 21320-1: 2015 मानक एक प्रतिबंधित ज़िप प्रारूप है, जैसे कि जावा आर्काइव फाइलों (.jar), ऑफिस ओपन एक्सएमएल फाइलों (माइक्रोसॉफ्ट ऑफिस। डॉक्स, .xlsx, .pptx), ऑफिस दस्तावेज़ में उपयोग किया जाता है प्रारूप फ़ाइलें (.odt, .ods, .odp), और ईपीबीबी फ़ाइलें (.epub)। वह मानक संपीड़न विधियों को 0 और 8 तक सीमित करता है, साथ ही अन्य बाधाओं जैसे कि एन्क्रिप्शन या हस्ताक्षर नहीं।

1 99 0 के आसपास, इन्फो-ज़िप समूह ने ज़िप के पोर्टेबल, मुक्त, मुक्त स्रोत कार्यान्वयन और unzip यूटिलिटीज को लिखा, डिफ्लेट प्रारूप के साथ संपीड़न का समर्थन किया, और इसके पहले के प्रारूपों का डिकंप्रेशन। इसने .zip प्रारूप के उपयोग को काफी विस्तारित किया।

90 के दशक के आरंभ में, जीजीआईपी प्रारूप को यूनिक्स compress उपयोगिता के प्रतिस्थापन के रूप में विकसित किया गया था, जो जानकारी-ज़िप उपयोगिताओं में डिफ्लेट कोड से लिया गया था। यूनिक्स compress को फ़ाइल नाम में .Z जोड़कर, एक फ़ाइल या स्ट्रीम को संपीड़ित करने के लिए डिज़ाइन किया गया था। compress LZW संपीड़न एल्गोरिदम का उपयोग करता है , जो उस समय पेटेंट के अधीन था और इसका मुफ्त उपयोग पेटेंट धारकों द्वारा विवाद में था। हालांकि डिफ्लेट के कुछ विशिष्ट कार्यान्वयनों को फिल काट्ज़ द्वारा पेटेंट किया गया था, प्रारूप नहीं था, और इसलिए एक डिफ्लेट कार्यान्वयन लिखना संभव था जिसने किसी भी पेटेंट का उल्लंघन नहीं किया था। पिछले 20+ सालों में यह कार्यान्वयन इतना चुनौतीपूर्ण नहीं रहा है। यूनिक्स gzip उपयोगिता को compress लिए ड्रॉप-इन प्रतिस्थापन के रूप में लक्षित किया गया था, और वास्तव में compress डेटा को डिकंप्रेस करने में सक्षम है (यह मानते हुए कि आप उस वाक्य को पार्स करने में सक्षम थे)। gzip फ़ाइल नाम पर .gz जोड़ता है। gzip Deflate संपीड़ित डेटा प्रारूप का उपयोग करता है, जो यूनिक्स compress तुलना में थोड़ा बेहतर compress , बहुत तेज़ डिकंप्रेशन होता है, और डेटा के लिए एक ईमानदारी जांच के रूप में एक सीआरसी -32 जोड़ता है। हेडर प्रारूप भी compress प्रारूप की अनुमति से अधिक जानकारी के भंडारण की अनुमति देता है, जैसे मूल फ़ाइल नाम और फ़ाइल संशोधन समय।

यद्यपि compress केवल एक फ़ाइल को संपीड़ित करता है, लेकिन tar उपयोगिता का उपयोग फ़ाइलों, उनके गुणों और उनकी निर्देशिका संरचना को एक .tar फ़ाइल में संग्रहित करने के लिए करना था, और फिर इसे .tar.Z बनाने के लिए compress साथ compress करना आम था .tar.Z फाइल वास्तव में tar उपयोगिता में संपीड़न करने के लिए एक ही समय में संपीड़न करने का विकल्प होता था, बजाय टैप के आउटपुट को compress करने के बजाय। यह सब gzip प्रारूप में आगे बढ़े, और tar पास .tar.gz प्रारूप को सीधे संपीड़ित करने का विकल्प होता है। tar.gz प्रारूप .zip दृष्टिकोण से बेहतर संपीड़ित करता है, क्योंकि .tar के संपीड़न फ़ाइलों में अनावश्यकता का लाभ उठा सकता है, विशेष रूप से कई छोटी फाइलें। .tar.gz यूनिक्स पर इसकी उच्च पोर्टेबिलिटी के कारण उपयोग में सबसे आम संग्रह प्रारूप है, लेकिन उपयोग में भी अधिक प्रभावी संपीड़न विधियां हैं, इसलिए आप अक्सर .tar.bz2 और .tar.xz अभिलेखागार देखेंगे।

.tar विपरीत, .zip अंत में एक केंद्रीय निर्देशिका है, जो सामग्री की एक सूची प्रदान करता है। वह और अलग संपीड़न .zip फ़ाइल में अलग-अलग प्रविष्टियों को यादृच्छिक पहुंच प्रदान करता है। एक .tar फ़ाइल को निर्देशिका बनाने के लिए प्रारंभ से अंत तक डिकंप्रेस और स्कैन किया जाना चाहिए, जो कि .tar फ़ाइल सूचीबद्ध है।

जीजीआईपी के परिचय के कुछ ही समय बाद, 1 99 0 के दशक के मध्य में, उसी पेटेंट विवाद ने .gif छवि प्रारूप के नि: शुल्क उपयोग पर सवाल उठाया, जिसे बुलेटिन बोर्डों और वर्ल्ड वाइड वेब (उस समय एक नई चीज़) पर व्यापक रूप से उपयोग किया जाता था। तो एक छोटे समूह ने पीजीजी को लापरवाही से संपीड़ित छवि प्रारूप बनाया, फ़ाइल प्रकार .png साथ .gif को प्रतिस्थापित करने के लिए। यह प्रारूप संपीड़न के लिए डिफ्लेट प्रारूप का भी उपयोग करता है, जो छवि डेटा पर फ़िल्टर के बाद लागू किया जाता है, जो अधिक रिडंडेंसी का पर्दाफाश करता है। पीएनजी प्रारूप के व्यापक उपयोग को बढ़ावा देने के लिए, दो मुफ्त कोड पुस्तकालय बनाए गए थे। libpng और zlib । libpng ने पीएनजी प्रारूप की सभी सुविधाओं को संभाला, और zlib ने libpng द्वारा उपयोग के लिए संपीड़न और डिकंप्रेशन कोड प्रदान किया, साथ ही अन्य अनुप्रयोगों के लिए भी। zlib gzip कोड से अनुकूलित किया गया था।

सभी उल्लिखित पेटेंट के बाद से समाप्त हो गया है।

ज़्लिब लाइब्रेरी डिफ्लेट संपीड़न और डिकंप्रेशन का समर्थन करता है, और डिफ्लेट स्ट्रीम के चारों ओर लपेटने के तीन प्रकार का समर्थन करता है। वे हैं: प्रोग्रामर के लिए gzip routines प्रदान करने के लिए, पीएनजी प्रारूप डेटा ब्लॉक, और gzip wrapping में उपयोग किया जाता है, जो सभी ("कच्चे" डिफ्लेट), zlib wrapping पर कोई लपेटना नहीं है। ज़्लिब और गीज़िप रैपिंग के बीच मुख्य अंतर यह है कि ज़्लिब रैपिंग अधिक कॉम्पैक्ट है, छः बाइट बनाम जीजीआईपी के लिए कम से कम 18 बाइट्स, और अखंडता जांच, एडलर -32, सीआरसी -32 की तुलना में तेज़ी से चलता है जो gzip उपयोग करता है। कच्चे डिफ्लेट का उपयोग प्रोग्राम द्वारा किया जाता है जो .zip प्रारूप को पढ़ और लिखते हैं, जो एक और प्रारूप है जो संकुचित डेटा को डिफ्लेट करने के आसपास लपेटता है।

zlib अब डेटा ट्रांसमिशन और स्टोरेज के लिए व्यापक उपयोग में है। उदाहरण के लिए, सर्वर और ब्राउज़र द्वारा अधिकांश HTTP लेन-देन zlib का उपयोग करके डेटा को संपीड़ित और डिक्रॉप करते हैं।

डिफ्लेट के विभिन्न कार्यान्वयन के परिणामस्वरूप एक ही इनपुट डेटा के लिए अलग संपीड़ित आउटपुट हो सकता है, जैसा कि चयन योग्य संपीड़न स्तर के अस्तित्व से प्रमाणित है जो CPU समय के लिए संपीड़न प्रभावशीलता को दूर करने की अनुमति देता है। zlib और PKZIP deflate संपीड़न और decompression का एकमात्र कार्यान्वयन नहीं हैं। 7-ज़िप संग्रह उपयोगिता और Google की zopfli लाइब्रेरी में ज़्लिब की तुलना में अधिक सीपीयू समय का उपयोग करने की क्षमता है, ताकि डिफ्लेट प्रारूप का उपयोग करते समय संभवतः पिछले कुछ बिट्स को निचोड़ने के लिए, ज़्लिब के उच्चतम की तुलना में संपीड़ित आकार को कुछ प्रतिशत तक कम किया जा सके। संपीड़न स्तर। पिज़्ज़ यूटिलिटी , जीजीआईपी के समानांतर कार्यान्वयन में, ज़्लिब (संपीड़न स्तर 1-9) या ज़ोपफली (संपीड़न स्तर 11) का उपयोग करने का विकल्प शामिल है, और कुछ प्रोसेसर पर बड़ी फ़ाइलों के संपीड़न को विभाजित करके zopfli का उपयोग करने के समय प्रभाव को कम करता है और कोर।


ZIP एक फ़ाइल प्रारूप है जो लापरवाही संपीड़न के साथ एक मनमानी संख्या में फ़ाइलों और फ़ोल्डर्स को संग्रहीत करने के लिए उपयोग किया जाता है। यह संपीड़न विधियों के उपयोग के बारे में कोई सख्त धारणा नहीं करता है, लेकिन इसका उपयोग अक्सर DEFLATE साथ किया जाता है।

Gzip पर आधारित एक संपीड़न एल्गोरिदम दोनों है, लेकिन संभावित पेटेंट एट अल के साथ कम से कम, और एक संकुचित फ़ाइल को संग्रहीत करने के लिए एक फ़ाइल प्रारूप है। यह tar के साथ संयुक्त होने पर फ़ाइलों और फ़ोल्डरों की मनमानी संख्या को संपीड़ित करने का समर्थन करता है। परिणामी फ़ाइल में .tgz या .tar.gz का विस्तार होता है और इसे आमतौर पर टैरबॉल कहा जाता है।

zlib अपने सबसे आम LZ77 अवतार में DEFLATE को encapsulating कार्यों की एक पुस्तकालय है।


मैं लंबे समय से इसका इंतजार कर रहा था, और कोई सरल काम करने वाला उदाहरण नहीं मिला, लेकिन इन उत्तरों के आधार पर मैंने downloadAndUnzip() फ़ंक्शन बनाया।

उपयोग काफी सरल है:

downloadAndUnzip('http://your-domain.com/archive.zip', 'yourfile.xml')
    .then(function (data) {
        console.log(data); // unzipped content of yourfile.xml in root of archive.zip
    })
    .catch(function (err) {
        console.error(err);
    });

और यहाँ घोषणा है:

var AdmZip = require('adm-zip');
var request = require('request');

var downloadAndUnzip = function (url, fileName) {

    /**
     * Download a file
     * 
     * @param url
     */
    var download = function (url) {
        return new Promise(function (resolve, reject) {
            request({
                url: url,
                method: 'GET',
                encoding: null
            }, function (err, response, body) {
                if (err) {
                    return reject(err);
                }
                resolve(body);
            });
        });
    };

    /**
     * Unzip a Buffer
     * 
     * @param buffer
     * @returns {Promise}
     */
    var unzip = function (buffer) {
        return new Promise(function (resolve, reject) {

            var resolved = false;

            var zip = new AdmZip(buffer);
            var zipEntries = zip.getEntries(); // an array of ZipEntry records

            zipEntries.forEach(function (zipEntry) {
                if (zipEntry.entryName == fileName) {
                    resolved = true;
                    resolve(zipEntry.getData().toString('utf8'));
                }
            });

            if (!resolved) {
                reject(new Error('No file found in archive: ' + fileName));
            }
        });
    };


    return download(url)
        .then(unzip);
};