String Nodejs中使用zlib进行数据压缩和解压缩

String Nodejs中使用zlib进行数据压缩和解压缩,string,node.js,compression,zlib,String,Node.js,Compression,Zlib,有人能给我解释一下zlib库在Nodejs中是如何工作的吗 我对Nodejs相当陌生,我还不知道如何使用缓冲区和流 我的简单场景是一个字符串变量,我想将字符串压缩或解压(deflate或inflate、gzip或gunzip等)到另一个字符串 即(我期望它如何工作) var zlib=require('zlib'); var str=“这是要压缩的测试字符串”; var zip=zlib.Deflate(str);//zip=[对象] var packed=zip.toString([encod

有人能给我解释一下zlib库在Nodejs中是如何工作的吗

我对Nodejs相当陌生,我还不知道如何使用缓冲区和流

我的简单场景是一个字符串变量,我想将字符串压缩或解压(deflate或inflate、gzip或gunzip等)到另一个字符串

即(我期望它如何工作)

var zlib=require('zlib');
var str=“这是要压缩的测试字符串”;
var zip=zlib.Deflate(str);//zip=[对象]
var packed=zip.toString([encoding?]);//packedstringdata=“packedstringdata”
var解压缩=零磅充气(打包);//解压=[对象]
var newstr=unzip.toString([再次-编码?]);//newstr=“这是要压缩的测试字符串”;

感谢您的帮助:)

更新:未意识到节点0.5中有新的内置“zlib”模块。我下面的回答是针对第三方的。将立即更新内置版本的答案

更新2:看起来内置的“zlib”可能有问题。文档中的示例代码对我不起作用。生成的文件无法gunzip(对我来说,失败为“意外的文件结尾”)。此外,该模块的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'
$node
>//加载zlib并创建要压缩的缓冲区
>var zlib=需要('zlib');
>var输入=新缓冲区('lorem ipsum dolor sit amet','utf8')
>//什么是“输入”?
>输入
>//压缩它
>zlib.deflate(输入)
>//压缩它并转换为utf8字符串,只是为了检查一下
>zlib.deflate(输入).toString('utf8')
‘x?/J?U?,(.?UH?/R(?,QH?M-\u0001\u0000?\u0015\t?’
>//压缩,然后解压缩(返回我们开始的内容)
>zlib.充气(zlib.放气(输入))
>//再次,并转换回初始字符串
>zlib.充气(zlib.放气(输入)).toString('utf8')
“lorem ipsum dolor sit amet”

broofa的回答很好,这正是我希望事情能够顺利进行的方式。对我来说,node坚持回调。这最终看起来像:

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
在deflate回调中:
在充气回调中:
到字符串:lorem ipsum dolor sit amet

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

链接到Nodejs zlib文档:是否有机会获得流和管道的介绍(它们是如何创建/使用的)?:)回答得很好,谢谢!抱歉,我没有时间(也不太熟悉管道API)。也许最好还是留一个单独的SO问题吧?意识到这是一篇老文章;)John Resig创建了一个用于处理节点流的伟大站点。希望这对类似情况的人有所帮助。zlib不会直接返回值,它需要回调为什么需要转换为“base64”?老实说,我不知道,这是我经过一天的实验后得出的解决方案。如果没有“base64”,解压将抱怨缺少或不正确的标题。我猜有些控制字符没有正确地序列化为本机字符串。请注意,如果要压缩到网络或文件流,则不需要“base64”。如果输入是缓冲区,为什么充气是异步函数?例如,为什么我们甚至需要一个inflateSync变体?在这个问题上有一个单独的SO线程:。也就是说,在我看来,拉链可能很昂贵,而且可能需要很多时间。此外,如果您试图压缩大型异步网络或文件流,回调就更有意义。另一方面,如果您的数据很小并且已经存储在内存中,那么使用同步就更容易了。