webentwicklung-frage-antwort-db.com.de

Komprimierung und Dekomprimierung von Daten mithilfe von Zlib in Nodejs

Kann mir bitte jemand erklären, wie die Zlib-Bibliothek in Nodejs funktioniert?

Ich bin relativ neu bei Nodejs und weiß noch nicht, wie ich Puffer und Streams verwenden soll.

Mein einfaches Szenario ist eine Stringvariable, und ich möchte entweder den String zu einem anderen String zippen oder entpacken (entlüften oder aufpumpen, gzip oder gunzip usw.).

Das heißt (wie ich es erwarten würde)

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

Danke für die Hilfe :)

25
Eli

Update: Ich wusste nicht, dass im Knoten 0.5 ein neues 'zlib'-Modul eingebaut ist. Meine Antwort ist für das Drittanbieter node-zlib-Modul . Wird die Antwort für die integrierte Version vorübergehend aktualisieren.

Update 2: Sieht so aus, als könnte ein Problem mit der eingebauten 'zlib' auftreten. Der Beispielcode in den Dokumenten funktioniert für mich nicht. Die resultierende Datei ist nicht gunzip'able (schlägt mit "unerwartetem Dateiende" für mich fehl). Außerdem ist die API dieses Moduls nicht besonders gut für das, was Sie versuchen, geeignet. Es ist mehr für die Arbeit mit Streams als mit Puffern, während das node-zlib-Modul eine einfachere API hat, die für Puffer einfacher zu verwenden ist.


Ein Beispiel für das Entlüften und Aufblasen mit dem Modul node-zlib von Drittanbietern:

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

Für alle, die 2016 darüber gestolpert sind (und sich auch fragen, wie man komprimierte Daten in eine Zeichenfolge statt in eine Datei oder einen Puffer serialisiert), sieht es so aus, als würde zlib (seit dem Knoten 0.11) jetzt synchrone Versionen seiner Funktionen bereitstellen, die keine Rückrufe erfordern:

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

die Antwort von broofa ist großartig, und genau so würde ich wie arbeiten. Für mich bestand der Knoten auf Rückrufen. Das sah so aus:

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

});

was gibt:

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
0
Ben