2011-10-02 9 views
18

क्या कोई मुझे बता सकता है कि zlib लाइब्रेरी नोडजेस में कैसे काम करती है?नोडजेस में zlib का उपयोग कर डेटा का संपीड़न और डिकंप्रेशन

मैं नोडजेस के लिए बिल्कुल नया हूं, और मुझे अभी तक यकीन नहीं है कि बफर और धाराओं का उपयोग कैसे करें।

मेरा सरल परिदृश्य एक स्ट्रिंग चर है, और मैं या तो ज़िप या अनजिप (डिफ्लेट या फुलाएं, gzip या gunzip, आदि ') स्ट्रिंग को किसी अन्य स्ट्रिंग में स्ट्रिंग करना चाहता हूं।

आईई। (मैं कैसे उम्मीद करेंगे यह काम करने के लिए)

var zlib = require('zlib'); 
var str = "this is a test string to be zipped"; 
var zip = zlib.Deflate(str); // zip = [object Object] 
var packed = zip.toString([encoding?]); // packed = "packedstringdata" 
var unzipped = zlib.Inflate(packed); // unzipped = [object Object] 
var newstr = unzipped.toString([again - encoding?]); // newstr = "this is a test string to be zipped"; 

धन्यवाद में मदद करता है के लिए :)

+0

लिंक NodeJS zlib प्रलेखन के लिए: http://nodejs.org/docs/v0.5.8/api /zlib.html – Eli

उत्तर

19

अद्यतन: पता ही नहीं था एक नया निर्मित 'zlib' नोड 0.5 में मॉड्यूल था। मेरा उत्तर तीसरी पार्टी node-zlib module के लिए है। क्षणिक रूप से अंतर्निहित संस्करण के लिए उत्तर अपडेट करेगा।

अपडेट 2: ऐसा लगता है कि अंतर्निहित 'zlib' के साथ कोई समस्या हो सकती है। दस्तावेज़ों में नमूना कोड मेरे लिए काम नहीं करता है। परिणामस्वरूप फ़ाइल gunzip'able नहीं है (मेरे लिए "फ़ाइल के अप्रत्याशित अंत" के साथ विफल रहता है)। साथ ही, उस मॉड्यूल का एपीआई जो आप करने की कोशिश कर रहे हैं उसके लिए विशेष रूप से उपयुक्त नहीं है। बफर के बजाय स्ट्रीम के साथ काम करने के लिए यह और अधिक है, जबकि नोड-जेएलआईबी मॉड्यूल में एक सरल एपीआई है जो बफर के लिए उपयोग करना आसान है।


अपस्फीति और चढ़ा, 3 पार्टी नोड zlib मॉड्यूल का उपयोग करने का एक उदाहरण:

$ node 

> // Load zlib and create a buffer to compress 
> var zlib = require('zlib'); 
> var input = new Buffer('lorem ipsum dolor sit amet', 'utf8') 

> // What's 'input'? 
> input 
<Buffer 6c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74> 

> // Compress it 
> zlib.deflate(input) 
<SlowBuffer 78 9c cb c9 2f 4a cd 55 c8 2c 28 2e cd 55 48 c9 cf c9 2f 52 28 ce 2c 51 48 cc 4d 2d 01 00 87 15 09 e5> 

> // Compress it and convert to utf8 string, just for the heck of it 
> zlib.deflate(input).toString('utf8') 
'x???/J?U?,(.?UH???/R(?,QH?M-\u0001\u0000?\u0015\t?' 

> // Compress, then uncompress (get back what we started with) 
> zlib.inflate(zlib.deflate(input)) 
<SlowBuffer 6c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74> 

> // Again, and convert back to our initial string 
> zlib.inflate(zlib.deflate(input)).toString('utf8') 
'lorem ipsum dolor sit amet' 
+0

धाराओं और पाइपों के लिए परिचय प्राप्त करने का कोई मौका (वे कैसे बनाए जाते हैं/उपयोग किए जाते हैं)? :) महान जवाब, धन्यवाद! – Eli

+0

क्षमा करें, वास्तव में समय नहीं है (और पाइप एपीआई से सुपर परिचित नहीं)। वैसे भी एक अलग एसओ सवाल के लिए शायद बेहतर छोड़ दिया? – broofa

+0

यह समझें कि यह एक पुरानी पोस्ट है;) जॉन रेजिग ने नोड स्ट्रीम के साथ खेलने के लिए एक महान साइट बनाई। http://ejohn.org/blog/node-js-stream-playground/ उम्मीद है कि यह किसी को भी इसी स्थिति में मदद करता है। – arcseldon

0

broofa के जवाब महान है, और है कि वास्तव में कैसे मैं तरह बातें काम करने के लिए चाहते हैं। मेरे लिए नोड ने कॉलबैक पर जोर दिया।

var zlib = require('zlib'); 
var input = new Buffer('lorem ipsum dolor sit amet', 'utf8') 


zlib.deflate(input, function(err, buf) { 
    console.log("in the deflate callback:", buf); 

    zlib.inflate(buf, function(err, buf) { 
      console.log("in the inflate callback:", buf); 
      console.log("to string:", buf.toString("utf8")); 
    }); 

}); 

जो देता है::

in the deflate callback: <Buffer 78 9c cb c9 2f 4a cd 55 c8 2c 28 2e cd 55 48 c9 cf c9 2f 52 28 ce 2c 51 48 cc 4d 2d 01 00 87 15 09 e5> 
in the inflate callback: <Buffer 6c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74> 
to string: lorem ipsum dolor sit amet 
22

किसी को भी 2016 में इस पर ठोकर के लिए (और भी सोच नहीं बल्कि एक फ़ाइल या एक बफर की तुलना में एक स्ट्रिंग के लिए संकुचित डेटा को क्रमानुसार करने के लिए कैसे) यह की तरह लग रही समाप्त हो गया - यह zlib तरह लग रहा है (के बाद से नोड 0.11) अब अपने कार्यों के तुल्यकालिक संस्करणों कि कॉलबैक की आवश्यकता नहीं है प्रदान करता है:

var zlib = require('zlib'); 
var input = "Hellow world"; 

var deflated = zlib.deflateSync(input).toString('base64'); 
var inflated = zlib.inflateSync(new Buffer(deflated, 'base64')).toString(); 

console.log(inflated); 
+0

'बेस 64' में रूपांतरण की आवश्यकता क्यों है? –

+4

ईमानदार होने के लिए, मुझे नहीं पता, यह एक समाधान है जिसे मैं प्रयोग के एक दिन बाद पहुंचा हूं। 'बेस 64' के बिना अनजिप गुम या गलत हेडर के बारे में शिकायत करेगा। मुझे लगता है कि कुछ नियंत्रण पात्रों को मूल स्ट्रिंग को क्रमशः क्रमबद्ध नहीं किया जाता है। ध्यान दें कि यदि आप किसी नेटवर्क या फ़ाइल स्ट्रीम को संपीड़ित कर रहे हैं - आपको 'base64' की आवश्यकता नहीं है। – Maksym

+0

इनपुट एक बफर है तो एसिंक फ़ंक्शन क्यों फुलाया जाता है? जैसेहमें एक inflateSync संस्करण की आवश्यकता क्यों है? – Kevin

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