node string node.js compression zlib

string - Compresión y descompresión de datos usando zlib en Nodejs



zlib js (3)

¿Puede alguien explicarme cómo funciona la biblioteca zlib en Nodejs?

Soy bastante nuevo en Nodejs, y aún no estoy seguro de cómo usar buffers y streams.

Mi escenario simple es una variable de cadena, y quiero comprimir o descomprimir (desinflar o inflar, gzip o gunzip, etc.) la cadena a otra cadena.

Es decir (como esperaría que funcione)

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

Gracias por las ayudas :)


La respuesta de Broofa es genial, y así es exactamente como me gustaría que las cosas funcionen. Para mi nodo insistió en las devoluciones de llamada. Esto terminó pareciendo:

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

lo que da:

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


Para cualquier persona que se tropiece con esto en 2016 (y también se pregunta cómo serializar datos comprimidos en una cadena en lugar de un archivo o un búfer), parece que zlib (desde el nodo 0.11) ahora ofrece versiones sincrónicas de sus funciones que no requieren devoluciones de llamada:

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


Actualización : No me di cuenta de que había un nuevo módulo ''zlib'' incorporado en el nodo 0.5. Mi respuesta a continuación es para el módulo node-zlib de terceros. Se actualizará la respuesta para la versión incorporada momentáneamente.

Actualización 2 : Parece que puede haber un problema con el ''zlib'' incorporado. El código de muestra en los documentos no funciona para mí. El archivo resultante no es gunzip''able (falla con "final de archivo inesperado" para mí). Además, la API de ese módulo no es particularmente adecuada para lo que estás tratando de hacer. Es más para trabajar con flujos en lugar de buffers, mientras que el módulo node-zlib tiene una API más simple que es más fácil de usar para los buffers.

Un ejemplo de desinflado e inflado, usando un módulo de nodo-zlib de terceros:

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