解压缩在JavaScript的gzip和zlib串(Decompress gzip and zlib

2019-07-19 01:33发布

我想从TMX文件中获取压缩层数据。 谁知道的解压gzip和zlib字符串中的javascript库? 我尝试zlib的 ,但它并没有为我工作。 实施例,在TMX文件层数据是:

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

我的JavaScript代码

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

它运行与显示消息错误“不支持的压缩方法”。 但我尝试在线工具,解压http://i-tools.org/gzip ,它返回正确的字符串。

Answer 1:

PAKO是一个完整的和现代Zlib端口。

这是一个很简单的例子,你可以从那里工作。

获取pako.js ,你可以解压缩的ByteArray像这样:

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

运行例如: http://jsfiddle.net/9yH7M/

另外,您可以将的base64编码阵列在发送前在为数组作为JSON或XML发送时占用了大量的开销。 同样解码:

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

运行例如: http://jsfiddle.net/9yH7M/1/

去更高级的,这里是pako API文档 。



Answer 2:

我可以解决我的问题zlib的 。 我解决我的代码如下

var base64Data = "eJztwTEBAAAAwqD1T20JT6AAAHgaCWAAAQ==";
var compressData = atob(base64Data);
var compressData = compressData.split('').map(function(e) {
    return e.charCodeAt(0);
});
var inflate = new Zlib.Inflate(compressData);
var output = inflate.decompress();


Answer 3:

对于使用Ruby on Rails的,谁愿意压缩编码后的数据发送到浏览器的人,然后通过JavaScript将其解压缩在浏览器上,我结合这两个优秀的答案上面到下面的解决方案。 下面是我的应用程序控制器,压缩,并通过发送@Variable它的浏览器到.html.erb文件之前编码字符串Rails服务器的代码:

require 'zlib'
require 'base64'

    def compressor (some_string)
        Base64.encode64(Zlib::Deflate.deflate(some_string))
    end

这里的JavaScript函数,它采用pako.min.js:

function uncompress(input_field){
    base64data = document.getElementById(input_field).innerText;
    compressData = atob(base64data);
    compressData = compressData.split('').map(function(e) {
        return e.charCodeAt(0);
    });
    binData = new Uint8Array(compressData);
    data = pako.inflate(binData);
    return String.fromCharCode.apply(null, new Uint16Array(data));
}

下面是该解压缩功能,这要unencode并解压缩存储在隐藏的HTML字段中的数据的JavaScript调用:

my_answer = uncompress('my_hidden_field');

下面是在滑轨的application.js文件中的条目调用pako.min.js,这是在/供应商/资产/ JavaScript的目录:

//= require pako.min

而我得到了pako.min.js从这里文件:

https://github.com/nodeca/pako/tree/master/dist

所有的工作在我的结束,反正! :-)



文章来源: Decompress gzip and zlib string in javascript