2

I was able to decompress a string in JavaScript using pako.js

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

// 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);

I want a method to compress string and output can be decompressed by above code using pako and gzip.

How can I do that?

3
  • What's going wrong when you simply do what's written in the docs? Note that pako has options to compress/decompress to/from string, so your typed array is not necessary. Commented Jun 4, 2018 at 13:20
  • 1
    @ASDFGerte I am doing var str ="Hello world"; var test = pako.gzip(new Uint8Array(str), {to: 'string'}); alert(btoa(test)); I get same output " H4sIAAAAAAAAAwMAAAAAAAAAAAA= " for any string and also not able to get back the original string after decompressing the output. Where am I going wrong? Commented Jun 5, 2018 at 5:32
  • The way you construct your Uint8Array is not working (always empty) - debugging your test for a short moment would quickly tell you that. You could fix that, but way easier is noticing that in gzip(data[, options]), data has a described type of "Uint8Array | Array | String", which means you can just do let test = pako.gzip(str, {to: 'string'});. Reverting the process is as simple as pako.ungzip(test, { to: 'string' });. Commented Jun 5, 2018 at 8:06

2 Answers 2

6

Compression:

let compressed_str = pako.gzip(str, {to: 'string'});

Decompression:

let original_str = pako.ungzip(compressed_str, { to: 'string' });

Sign up to request clarification or add additional context in comments.

2 Comments

The compressed string looks like this: 31,139,8,0,0,0,0,0,0,3,203,72,205,201,201,87,200,64,144,0,128,136,249,229,17,0,0,0, but I think the question is asking for base64 encoded string
pako no longer accepts {to: 'string'}. It returns a uIntArray, which needs to be converted to a string. If sending over HTTP, the most simple/common method I've seen is window.btoa(String.fromCharCode.apply(null, pakoGzippedData)). There are many other ways
2

There is a duplicate question, so I'm sharing my answer here.

https://stackoverflow.com/a/75934779/7295761

{to: 'string'} simply doesn't work for latest pako.js

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.