Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Decompress gzip and zlib string in javascript

I want to get compress layer data from tmx file . Who knows libraries for decompress gzip and zlib string in javascript ? I try zlib but it doesn't work for me . Ex , layer data in tmx file is :

  <data encoding="base64" compression="zlib">        eJztwTEBAAAAwqD1T20JT6AAAHgaCWAAAQ==   </data> 

My javascript code is

var base64Data = "eJztwTEBAAAAwqD1T20JT6AAAHgaCWAAAQ=="; var compressData = atob(base64Data); var inflate = new Zlib.Inflate(compressData); var output = inflate.decompress(); 

It runs with displays message error "unsupported compression method" . But I try decompress with online tool as http://i-tools.org/gzip , it returns correct string.

like image 327
Toan Nguyen Avatar asked Jan 31 '13 07:01

Toan Nguyen


People also ask

Can zlib decompress gzip?

The zlib module can be used to implement support for the gzip and deflate content-encoding mechanisms defined by HTTP.

Does gzip use zlib?

zlib was adapted from the gzip code. All of the mentioned patents have since expired. The zlib library supports Deflate compression and decompression, and three kinds of wrapping around the deflate streams.

What is zlib decompress?

With the help of zlib. decompress(s) method, we can decompress the compressed bytes of string into original string by using zlib.


1 Answers

Pako is a full and modern Zlib port.

Here is a very simple example and you can work from there.

Get pako.js and you can decompress byteArray like so:

<html> <head>   <title>Gunzipping binary gzipped string</title>   <script type="text/javascript" src="pako.js"></script>   <script type="text/javascript">      // Get datastream as Array, for example:     var charData    = [31,139,8,0,0,0,0,0,0,3,5,193,219,13,0,16,16,4,192,86,214,151,102,52,33,110,35,66,108,226,60,218,55,147,164,238,24,173,19,143,241,18,85,27,58,203,57,46,29,25,198,34,163,193,247,106,179,134,15,50,167,173,148,48,0,0,0];      // Turn number array into byte-array     var binData     = new Uint8Array(charData);      // Pako magic     var data        = pako.inflate(binData);      // Convert gunzipped byteArray back to ascii string:     var strData     = String.fromCharCode.apply(null, new Uint16Array(data));      // Output to console     console.log(strData);    </script> </head> <body>     Open up the developer console. </body> </html> 

Running example: http://jsfiddle.net/9yH7M/

Alternatively you can base64 encode the array before you send it over as the Array takes up a lot of overhead when sending as JSON or XML. Decode likewise:

// Get some base64 encoded binary data from the server. Imagine we got this: var b64Data     = 'H4sIAAAAAAAAAwXB2w0AEBAEwFbWl2Y0IW4jQmziPNo3k6TuGK0Tj/ESVRs6yzkuHRnGIqPB92qzhg8yp62UMAAAAA==';  // Decode base64 (convert ascii to binary) var strData     = atob(b64Data);  // Convert binary string to character-number array var charData    = strData.split('').map(function(x){return x.charCodeAt(0);});  // Turn number array into byte-array var binData     = new Uint8Array(charData);  // Pako magic var data        = pako.inflate(binData);  // Convert gunzipped byteArray back to ascii string: var strData     = String.fromCharCode.apply(null, new Uint16Array(data));  // Output to console console.log(strData); 

Running example: http://jsfiddle.net/9yH7M/1/

To go more advanced, here is the pako API documentation.

like image 104
Redsandro Avatar answered Sep 20 '22 05:09

Redsandro