2011-10-02 23 views
18

Nodejでzlibライブラリがどのように機能するか教えてください。Nodejsでzlibを使用したデータの圧縮と圧縮解除

私はNodejsをかなり使い慣れています。バッファとストリームの使い方はまだ分かりません。

私の単純なシナリオは文字列変数です。私は、文字列を別の文字列に圧縮または伸張する(deflateまたはinflate、gzipまたはgunzipなど)必要があります。

I.e. (私はそれが動作するように期待する方法)に役立ちます:)

+0

リンク:http://nodejs.org/docs/v0.5.8/apiを/zlib.html – Eli

答えて

19

更新ため

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

ありがとう:ノード0.5の新しいビルトイン「のzlib」モジュールがあった実現しなかったが。私の答えは第三者のためのものですnode-zlib module。暫定的に内蔵バージョンの回答を更新します。

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


サードパーティノードの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' 
+0

ストリームやパイプへのイントロを得るチャンス(作成/使用方法) :)すばらしい答え、ありがとう! – Eli

+0

申し訳ありませんが、実際には時間がありません(パイプAPIには慣れていない)。とにかく別のSOの質問のために残されたほうがいいでしょうか? – broofa

+0

これは古い投稿であることを認識してください;)John Resig氏は、Node Streamsで遊ぶための素晴らしいサイトをまとめました。 http://ejohn.org/blog/node-js-stream-playground/似たような状況で誰かを助けてくれることを願っています。 – arcseldon

0

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 
22

を誰もが2016年にこの上でつまずく(とも文字列ではなく、ファイルまたはバッファに圧縮されたデータをシリアル化する方法を疑問に思う)のためにこれはのように見えることになりました - (ノード0.11以降)今、コールバックを必要としないその機能の同期バージョン提供し、それはzlibのように見える:Nodejsのzlibのドキュメントへ

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

「base64」に変換する必要があるのはなぜですか? –

+4

正直言って、私は知らない、それは私が実験の日後に到着した解決策です。 'base64'がなければ、unzipはヘッダーがないか間違っていると不満を持ちます。私は、いくつかの制御文字がネイティブ文字列に正しくシリアル化されないと思います。ネットワークやファイルストリームに圧縮する場合は、 'base64'は必要ありません。 – Maksym

+0

入力がバッファーの場合、非同期関数を拡張するのはなぜですか?例えば。なぜinflateSyncバリアントが必要なのでしょうか? – Kevin