【发布时间】:2012-09-17 21:48:16
【问题描述】:
我需要使用 zlib 在极端压缩级别压缩 Node.js 中的缓冲区。输出的标头应该是 78 DA。除非我遗漏了什么,否则 Node.js 文档并没有真正描述如何使用 zlib.Deflate 类。它不接受任何参数。
【问题讨论】:
我需要使用 zlib 在极端压缩级别压缩 Node.js 中的缓冲区。输出的标头应该是 78 DA。除非我遗漏了什么,否则 Node.js 文档并没有真正描述如何使用 zlib.Deflate 类。它不接受任何参数。
【问题讨论】:
使用zlib. createGzip/createDeflate 获取您需要的压缩器实例,并在对象中提供选项。
如果你想在内存中做这一切:
var zlib = require('zlib');
// create a new gzip object
var gzip = zlib.createGzip({
level: 9 // maximum compression
}), buffers=[], nread=0;
// attach event handlers...
gzip.on('error', function(err) {
gzip.removeAllListeners();
gzip=null;
});
gzip.on('data', function(chunk) {
buffers.push(chunk);
nread += chunk.length;
});
gzip.on('end', function() {
var buffer;
switch (buffers.length) {
case 0: // no data. return empty buffer
buffer = new Buffer(0);
break;
case 1: // only one chunk of data. return it.
buffer = buffers[0];
break;
default: // concatenate the chunks of data into a single buffer.
buffer = new Buffer(nread);
var n = 0;
buffers.forEach(function(b) {
var l = b.length;
b.copy(buffer, n, 0, l);
n += l;
});
break;
}
gzip.removeAllListeners();
gzip=null;
// do something with `buffer` here!
});
// and finally, give it data to compress
gzip.write(inputBuffer);
gzip.end();
当然,如果您要处理大量数据,请将输出流式传输到文件中,而不是在内存中缓冲所有内容。
【讨论】:
Buffer.concat 直到 Node 0.8 才存在。您必须在旧版本上这样做。 (我最初是在 0.8 之前写的这段代码)