JavaScript: Decompress / inflate /unzip /ungzip strings

88.9k views Asked by At

I'm looking for JavaScript implementation of string inflating algorithms. I want to compress on the server side (Java), and decompress on the client side (JavaScript).

I've found:

unzip strings in javascript
That one is marked as answered with an answer for different problem. Other answers are also for something else (unzipping files in ZIP format).

JavaScript inflate implementation (possibly FF 3.6 only)
This is closest to what I need. However I'd like to have some alternatives.

Suggestions?
Thanks, Ondra

Update: I have quite a specific use case, please don't answer "Don't do that in JavaScript." I am writing an "offline" reporting tool (once generated, it's put to a static store) and deflating may save megabytes for a single report. I am constrained by other apps so I can't store it as a zip file.

7

There are 7 answers

0
Sean Kinsey On BEST ANSWER

Take a look at this Stack Overflow question, the answers there contains references to multiple compressing engines implemented in javascript. Most of these are based on LZ77.

18
ThiefMaster On

Don't do that in JavaScript. It'd be slow and besides that JS doesn't do well with binary data.

Simply use gzip transfer encoding on the server side and your browser will take care of decompressing it.

3
Gustavo Costa De Oliveira On

I don't know how you'd like that, but I like these implementations:

The first is fastest than second, We can usually ensure a fast server, however we don't know the performance of the client machine. Therefore I recommend you choose js-deflate and adjust your java (server side) to inflate.

https://github.com/dankogai/js-deflate

http://code.google.com/p/gzipjs/

0
Alexander Staubo On

I found a working inflate implementation here:

http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt

If you want a slightly cleaner version that namespaces the algorithm, this one should work:

https://github.com/augustl/js-inflate

Keep in mind that gzipped "inflate" data is prefixed with a two-byte header, and suffixed with a four-byte checksum, which you will need to strip before passing to the algorithm.

2
Cheeso On

This example: http://cheeso.members.winisp.net/srcview.aspx?dir=js-unzip shows how you can do ZIP files in Javascript. Now, I know you want ZLIB or DEFLATE compression, rather than ZIP. But, ZIP uses DEFLATE, and within the .js file for that example, there is an InflatingReader class that can INFLATE as it reads.

The class exposes these methods:

readByte()
   returns null when EOF is reached, or the value of the byte when successful.

readToEnd()
   returns an array of all bytes read, to EOF

beginReadToEnd(callback)
   async version of the above

readBytes(n)
   returns an array of n bytes read from the source.

beginReadBytes(n, callback)
   async version of the above

You can use that code unchanged if you want INFLATE.

If you want ZLIB (aka unzip), then there is a 2-byte signature that you need to read and validate before reading the compressed bytes and doing the INFLATE. Just modify the InflatingReader to read and dump 2 bytes, and it will do ZLIB just fine.

0
Redsandro On

I created a working example using pako, modern and fast Zlib port. http://jsfiddle.net/9yH7M/2/

0
Breton On

there's this graphing library that has as part of it, a zlib implementation in javascript. if you scroll down this page a bit, you'll see it as a separate download. http://jsxgraph.uni-bayreuth.de/wp/download/