web-dev-qa-db-ja.com

Nodejsのzlibを使用したデータの圧縮と解凍

Nodejsでzlibライブラリがどのように機能するかを誰かに説明してもらえますか?

私はNodejsを初めて使用しますが、バッファとストリームの使用方法がまだわかりません。

私の単純なシナリオは文字列変数であり、文字列を別の文字列にZipまたはunzip(deflateまたはinflate、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";

助けてくれてありがとう:)

27
Eli

Update:ノード0.5に新しいビルトイン 'zlib'モジュールがあることに気づきませんでした。以下の私の答えは、サードパーティ node-zlibモジュール に対するものです。ビルトインバージョンの回答を一時的に更新します。

Update 2:組み込みの 'zlib'に問題があるようです。ドキュメント内のサンプルコードは私には機能しません。結果のファイルはgunzip可能ではありません(「予期しないファイルの終わり」で失敗します)。また、そのモジュールのAPIは、あなたがしようとしていることに特に適していません。 node-zlibモジュールには、バッファーで使用するのが簡単なシンプルなAPIがありますが、バッファーではなくストリームを操作するためのものです。


サードパーティのnode-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'
22
broofa

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

broofaの答えは素晴らしく、それがまさに私がlike動作するようにする方法です。私の場合、ノードはコールバックを要求しました。これは次のようになりました:

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