Gzip的JavaScript实现

我正在编写一个Web应用程序,需要通过AJAX将JSON数据存储在小型,固定大小的服务器端caching中(请考虑: Opensocial配额 )。 我无法控制服务器。

我需要减less存储的数据的大小,以保持在服务器端的配额,并希望能够在浏览器中发送string化JSON之前发送到服务器。

但是,我无法findGzip的JavaScript实现方式。 任何build议如何在发送之前在客户端压缩数据?

编辑http://pieroxy.net/blog/pages/lz-string/index.html (感谢评论中的pieroxy),似乎有一个更好的LZW解决scheme可以正确处理Unicodestring。


我不知道任何gzip实现,但jsolait库 (该网站似乎已经消失)具有LZW压缩/解压缩的function。 代码在LGPL下面 。

// LZW-compress a string function lzw_encode(s) { var dict = {}; var data = (s + "").split(""); var out = []; var currChar; var phrase = data[0]; var code = 256; for (var i=1; i<data.length; i++) { currChar=data[i]; if (dict[phrase + currChar] != null) { phrase += currChar; } else { out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0)); dict[phrase + currChar] = code; code++; phrase=currChar; } } out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0)); for (var i=0; i<out.length; i++) { out[i] = String.fromCharCode(out[i]); } return out.join(""); } // Decompress an LZW-encoded string function lzw_decode(s) { var dict = {}; var data = (s + "").split(""); var currChar = data[0]; var oldPhrase = currChar; var out = [currChar]; var code = 256; var phrase; for (var i=1; i<data.length; i++) { var currCode = data[i].charCodeAt(0); if (currCode < 256) { phrase = data[i]; } else { phrase = dict[currCode] ? dict[currCode] : (oldPhrase + currChar); } out.push(phrase); currChar = phrase.charAt(0); dict[code] = oldPhrase + currChar; code++; oldPhrase = phrase; } return out.join(""); } 

我有另一个问题,我不想在gzip中编码数据,但解码gzip的数据 。 我在浏览器外部运行JavaScript代码,所以我需要使用 JavaScript来解码。

我花了一些时间,但我发现在JSXGraph库有一种方法来读取压缩的数据。

这里是我find的库: http : //jsxgraph.uni-bayreuth.de/wp/2009/09/29/jsxcompressor-zlib-compressed-javascript-code/甚至有一个独立的工具可以做到这一点, JSXCompressor ,代码是LGPL licencied。

只需在您的项目中包含jsxcompressor.js文件,然后就可以读取基本的64位编码压缩数据:

 <!doctype html> </head> <title>Test gzip decompression page</title> <script src="jsxcompressor.js"></script> </head> <body> <script> document.write(JXG.decompress('<?php echo base64_encode(gzencode("Try not. Do, or do not. There is no try.")); ?>')); </script> </html> 

我明白这不是你想要的,但我仍然在这里回答,因为我怀疑这会帮助一些人。

我们刚刚发布pako https://github.com/nodeca/pako,zlib的端口到JavaScript。; 我认为这是现在最快的js执行deflate / inflate / gzip / ungzip。 此外,它拥有民主的MIT许可证。 Pako支持所有的zlib选项,结果是二进制平等的。

我把一个GWT模块的LZMA实现移植到了独立的JavaScript中。 这就是所谓的LZMA-JS 。

以下是一些在Javascript中实现的其他压缩algorithm:

  • 霍夫曼
  • LZ77

我没有testing,但有一个ZIP的JavaScript实现,称为JSZip:

http://jszip.stuartk.co.uk/

https://stuk.github.io/jszip/

我猜测通用的客户端JavaScript压缩实现在处理时间方面是一个非常昂贵的操作,而不是使用未压缩的有效负载传输几个HTTP数据包的时间。

你有没有做过任何testing,会给你一个想法多less时间来保存? 我的意思是,带宽节省不可能是你以后的,或者可以吗?

大多数浏览器可以dynamic地解压缩gzip。 这可能是比JavaScript实现更好的select。

您可以在页面中embedded一个1像素的Java小应用程序,并将其用于压缩。

这不是JavaScript,客户端将需要一个Java运行时,但它会做你所需要的。