代码之家  ›  专栏  ›  技术社区  ›  David Citron

Gzip的JavaScript实现[关闭]

  •  200
  • David Citron  · 技术社区  · 16 年前

    我正在编写一个Web应用程序,它需要通过AJAX将JSON数据存储在一个小的、固定大小的服务器端缓存中(想想: Opensocial quotas ). 我无法控制服务器。

    我需要减小存储数据的大小,以保持在服务器端配额内,并希望能够在将字符串化的JSON发送到服务器之前,在浏览器中对其进行gzip操作。

    然而,我在Gzip的JavaScript实现中找不到太多的方法。关于如何在发送数据之前压缩客户端的数据,有什么建议吗?

    9 回复  |  直到 14 年前
        1
  •  135
  •   Matthew Crumley    12 年前

    编辑 似乎有一个更好的LZW解决方案可以在 http://pieroxy.net/blog/pages/lz-string/index.html (感谢pieroxy在评论中)。


    我不知道任何gzip实现,但是 jsolait library (站点似乎已经消失)具有LZW压缩/解压缩功能。代码包含在 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("");
    }
    
        2
  •  52
  •   pcans    14 年前

    我还有一个问题,我不想用gzip编码数据,但是 解码gzip数据 . 我在浏览器外运行javascript代码,因此需要使用 纯净的 javascript。

    我花了一些时间,但我发现 JSX图表 库有一种读取gzip数据的方法。

    这是我找到图书馆的地方: http://jsxgraph.uni-bayreuth.de/wp/2009/09/29/jsxcompressor-zlib-compressed-javascript-code/ 甚至还有一个独立的实用程序可以做到这一点, JSX压缩机 ,代码已获得LGPL许可。

    只要在项目中包含jsxcompressor.js文件,就可以读取基本的64编码gzip数据:

    <!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>
    

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

        3
  •  36
  •   Unreality    6 年前

    我们刚放了帕科 https://github.com/nodeca/pako ,zlib到javascript的端口。我认为这是deflate/inflate/gzip/ungzip最快的js实现。此外,它还拥有麻省理工学院的民主执照。Pako支持所有zlib选项,其结果是二进制相等的。

    例子:

    var inflate = require('pako/lib/inflate').inflate; 
    var text = inflate(zipped, {to: 'string'});
    
        4
  •  17
  •   user440788user440788    5 年前

    我将LZMA的一个实现从GWT模块移植到独立的JavaScript中。它叫 LZMA-JS .

        5
  •  14
  •   Mauricio Scheffer    15 年前

    下面是用Javascript实现的一些其他压缩算法:

        6
  •  8
  •   erikvold    9 年前

    我没有测试,但是有一个ZIP的javascript实现,叫做JSZip:

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

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

        7
  •  0
  •   Tomalak    16 年前

    就处理时间而言,我想一个通用的客户端JavaScript压缩实现将是一个非常昂贵的操作,而不是使用未压缩的负载传输更多的HTTP数据包的时间。

    你有没有做过测试,让你知道有多少时间可以节省?我的意思是,带宽节约不可能是你想要的,或者是它?

        8
  •  -2
  •   ThomasThomas    16 年前

    大多数浏览器可以动态解压缩gzip。这可能是比javascript实现更好的选择。

        9
  •  -4
  •   Bogdan    16 年前

    您可以使用嵌入在页面中的1像素/1像素Java小程序进行压缩。

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