2011-10-02 136 views
18

有人可以请我解释一下zlib库如何在Nodejs中工作?在Nodejs中使用zlib压缩和解压数据

我对Nodejs相当陌生,我不确定如何使用缓冲区和流。

我的简单场景是一个字符串变量,我想要压缩或解压缩(压缩或膨胀,gzip或gunzip等')字符串到另一个字符串。

I.e. (我怎么会想到它的工作)

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

链接到的zlib的NodeJS文件:http://nodejs.org/docs/v0.5.8/api /zlib.html – Eli

回答

19

更新:没有意识到有一个新的内置“的zlib”在节点0.5模块。我的回答如下第三方node-zlib module。将立即更新内置版本的答案。

更新2:看起来像是内置的'zlib'可能存在问题。文档中的示例代码不适用于我。生成的文件不是gunzip'able(对于我来说,因为“文件意外结束”失败)。另外,该模块的API并不是特别适合你想要做的事情。更多的是使用流而不是缓冲区,而node-zlib模块有一个更简单的API,它更容易用于缓冲区。


的放气和充气,使用第三方节点的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

对不起,真的没有时间(而且不熟悉管道API)。无论如何可能更好地留下一个单独的SO问题? – broofa

+0

认识到这是一个旧帖子;)John Resig为节点流放置了一个很棒的站点。 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

为什么需要转换为'base64'? –

+4

说实话,我不知道,这是我在一天的实验后得出的解决方案。如果没有'base64'解压缩会报告丢失或不正确的标题。我猜一些控制字符不会正确地序列化为本地字符串。请注意,如果你压缩到网络或文件流 - 你不应该需要'base64'。 – Maksym

+0

如果输入是缓冲区,为什么要膨胀一个异步函数?例如。为什么我们甚至需要一个inflateSync变体? – Kevin