31

tmx ファイルから圧縮レイヤー データを取得したい。javascript で gzip および zlib 文字列を解凍するためのライブラリを知っているのは誰ですか? 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としてオンラインツールで解凍しようとすると、正しい文字列が返されます。

4

3 に答える 3

45

パコは充実した近代的な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/

または、JSON または XML として送信するときに配列が多くのオーバーヘッドを占めるため、送信する前に配列を base64 エンコードすることもできます。同様にデコードします。

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

より高度な方法については、pakoAPI ドキュメントを参照してください。

于 2014-03-26T23:50:36.203 に答える
12

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();
于 2013-02-05T09:35:05.037 に答える
7

Ruby on Rails を使用していて、圧縮されたエンコード データをブラウザーに送信し、ブラウザーで Javascript を介して圧縮解除したい人のために、上記の両方の優れた回答を次のソリューションに組み合わせました。これは、 @ 変数を介して .html.erbファイルにブラウザーに送信する前に、文字列を圧縮およびエンコードするアプリケーション コントローラーの Rails サーバー コードです。

require 'zlib'
require 'base64'

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

pako.min.js を使用する Javascript 関数は次のとおりです。

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

非圧縮 HTML フィールド内に格納されたデータをエンコード解除および圧縮解除する、その uncompress 関数への JavaScript 呼び出しを次に示します。

my_answer = uncompress('my_hidden_field');

/vendor/assets/javascriptsディレクトリにあるpako.min.jsを呼び出すための Rails application.jsファイルのエントリを次に示します。

//= require pako.min

そして、ここからpako.min.jsファイルを取得しました。

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

とにかく、すべてが私の最後で機能します!:-)

于 2015-05-14T15:08:17.483 に答える