2011-10-02 15 views
18

Nodej에서 zlib 라이브러리가 어떻게 작동하는지 설명해 줄 수 있습니까?Nodejs에서 zlib을 사용하여 데이터 압축 및 압축 해제

저는 Nodejs를 처음 접했고 버퍼와 스트림을 사용하는 방법을 아직 모릅니다.

간단한 간단한 시나리오는 문자열 변수이며, 문자열을 다른 문자열로 압축하거나 압축을 풀거나 압축을 풀거나 gzip 또는 gunzip 등으로 압축을 풀고 싶습니다.

e.e. (가) 도움을 위해 :

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

감사합니다 (I 기대 어떻게 작동하는)

+0

링크 Nodejs의 ZLIB 문서로를 : http://nodejs.org/docs/v0.5.8/api /zlib.html – Eli

답변

19

업데이트 : 노드 0.5의 새로운 내장 된 'ZLIB'모듈이 몰랐어요. 내 대답은 제 3 자에 대한 것입니다 node-zlib module. 잠시 후 기본 버전의 대답을 업데이트합니다.

업데이트 2 : 내장 'zlib'에 문제가있는 것 같습니다. 워드 프로세서에서 샘플 코드가 작동하지 않습니다. 결과 파일은 gunzip'able이 아닙니다 ("예기치 않은 파일 끝"으로 인해 실패 함). 또한 해당 모듈의 API는 사용자가하려는 일에 특히 적합하지 않습니다. 버퍼가 아닌 스트림으로 작업하는 것이 더 많은 반면, node-zlib 모듈은 버퍼로 사용하기가 더 쉬운 간단한 API를 가지고 있습니다.


제 3 자 노드 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에 익숙하지 않은 시간이 없습니다. 아마 어쨌든 별도의 질문에 대한 더 나은 왼쪽? – broofa

+0

이것은 오래된 게시물이라고 생각합니다.) John Resig는 노드 스트림으로 놀기에 훌륭한 사이트를 구성했습니다. http://ejohn.org/blog/node-js-stream-playground/ 비슷한 상황에있는 사람에게 도움이되기를 바랍니다. – arcseldon

0

broofa의 대답은 대단한, 그리고 내가 일하는 같은 것들을 거라고 정확히 방법입니다. 나를 위해 콜백을 주장하는 노드. (또한 오히려 파일이나 버퍼보다 ​​문자열로 압축 된 데이터를 직렬화하는 방법을 궁금해)

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 년이에 비틀 거리는 사람을 위해

: 제공

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

}); 

:이처럼 보이는 결국 -이 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); 
+0

왜 'base64'로 변환해야합니까? –

+4

솔직히 말해서, 나는 그것이 실험의 하루 후에 도착한 해결책이라는 것을 모른다. 'base64'가 없으면 unzip은 누락되거나 잘못된 헤더에 대해 불평합니다. 일부 제어 문자가 네이티브 문자열에 제대로 직렬화되지 않는다고 생각합니다. 네트워크 또는 파일 스트림으로 압축하는 경우 'base64'가 필요하지 않습니다. – Maksym

+0

입력이 버퍼 인 경우 비동기 함수를 부 풀리는 이유는 무엇입니까? 예 :왜 우리는 심지어 inflateSync 변종이 필요한가요? – Kevin