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

问题描述 投票:0回答:4

有人可以向我解释一下 zlib 库在 Nodejs 中是如何工作的吗?

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

我的简单场景是一个字符串变量,我想将字符串压缩或解压缩(放气或膨胀,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";

感谢您的帮助:)

string node.js compression zlib
4个回答
83
投票

对于 2016 年遇到这个问题的人(并且想知道如何将压缩数据序列化为字符串而不是文件或缓冲区) - 看起来 zlib (自 Node 0.11 起)现在提供了不需要回调的同步版本的函数:

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

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

console.log(inflated);

语法已更改为简单:

var inflated = zlib.inflateSync(Buffer.from(deflated, 'base64')).toString()

32
投票

更新:没有意识到node 0.5中有一个新的内置'zlib'模块。我下面的答案是针对第 3 方 node-zlib 模块。将立即更新内置版本的答案。

更新 2:看起来内置“zlib”可能存在问题。文档中的示例代码对我不起作用。生成的文件无法进行gunzip(对我来说失败并出现“意外的文件结尾”)。此外,该模块的 API 并不是特别适合您想要做的事情。它更适合处理流而不是缓冲区,而 node-zlib 模块有一个更简单的 API,更容易用于缓冲区。


使用第 3 方 node-zlib 模块进行放气和充气的示例:

// 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'

4
投票

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
    

2
投票
这是代码的非回调版本:

var zlib = require('zlib'); var input = new Buffer.from('John Dauphine', 'utf8') var deflated= zlib.deflateSync(input); console.log("Deflated:",deflated.toString("utf-8")); var inflated = zlib.inflateSync(deflated); console.log("Inflated:",inflated.toString("utf-8"))

© www.soinside.com 2019 - 2024. All rights reserved.