Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compression and decompression of data using zlib in Nodejs

Can someone please explain to me how the zlib library works in Nodejs?

I'm fairly new to Nodejs, and I'm not yet sure how to use buffers and streams.

My simple scenario is a string variable, and I want to either zip or unzip (deflate or inflate, gzip or gunzip, etc') the string to another string.

I.e. (how I would expect it to work)

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"; 

Thanks for the helps :)

like image 748
Eli Avatar asked Oct 02 '11 08:10

Eli


People also ask

Why zlib is used in Node JS?

The zlib module in Node. js provides compression and decompression functionality utilizing Gzip, Deflate/Inflate, and Brotli. It can be accessed in your program with: const zlib = require('zlib');

What is zlib decompress?

With the help of zlib. decompress(s) method, we can decompress the compressed bytes of string into original string by using zlib.


2 Answers

For anybody stumbling on this in 2016 (and also wondering how to serialize compressed data to a string rather than a file or a buffer) - it looks like zlib (since node 0.11) now provides synchronous versions of its functions that do not require callbacks:

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

Syntax has changed to simply:

var inflated = zlib.inflateSync(Buffer.from(deflated, 'base64')).toString() 
like image 135
Maksym Avatar answered Sep 22 '22 14:09

Maksym


Update: Didn't realize there was a new built-in 'zlib' module in node 0.5. My answer below is for the 3rd party node-zlib module. Will update answer for the built-in version momentarily.

Update 2: Looks like there may be an issue with the built-in 'zlib'. The sample code in the docs doesn't work for me. The resulting file isn't gunzip'able (fails with "unexpected end of file" for me). Also, the API of that module isn't particularly well-suited for what you're trying to do. It's more for working with streams rather than buffers, whereas the node-zlib module has a simpler API that's easier to use for Buffers.


An example of deflating and inflating, using 3rd party node-zlib module:

// 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' 
like image 29
broofa Avatar answered Sep 19 '22 14:09

broofa