簡體   English   中英

無法使用javascript解碼平鋪的base64數據

[英]Trouble decoding tiled base64 data with javascript

我正在使用平鋪來創建平鋪地圖。 (Tiled是一個瓦片地圖編輯器,支持正交和等距地圖)

它將地圖保存在XML文件中。 它可以使用某些編碼結構:

  • 常規base64
  • base64 + gzip
  • base64 + zlib
  • 常規csv

現在,我已經完全放棄了gzip(無論如何我的服務器gzips流量,所以沒有損失)所以我想我會嘗試使用base64 jquery插件進行常規base64解碼

但數據出現亂碼,如下所示:

��������������������������������������������������������

我猜它是二進制編碼,但我該如何解決呢?

需要解碼的示例數據(常規base64):

jQAAAI4AAACPAAAAkAAAAJEAAACSAAAAkwAAAKEAAACiAAAAowAAAKQAAAClAAAApgAAAKcAAAA=

需要解碼的示例數據(gzip base64):

H4sIAAAAAAAACw3DhwnAMAwAMP8P2Rdk9s1KoBQR2WK12R1Ol9vj9fn5A/luZ4Y4AAAA

示例數據為csv:

141,142,143,144,145,146,147,
161,162,163,164,165,166,167

那么如何將常規base64編碼位轉為csv呢?

編輯:

使用解決方案Pointy發現我得到了一個半正確的數組。 但是,在幾千個字符后,2個數字將再次出錯。 之后甚至更頻繁。

然后我找到了一個在他的方案中也使用了tiles和base64編碼的人。 解碼完陣列后,他也這樣做了:

        var d = base64_decode($(this).find('data').text());
    var e = new Array();
    for (var i = 0; i <= d.length; i += 4) {
    var f = d[i] | d[i + 1] << 8 | d[i + 2] << 16 | d[i + 3] << 24;
    e.push(f)
    }

我不知道為什么需要它,但至少它是有效的。 如果有人能解釋,請做!

嘗試逐個字符地查看返回的字符串。 換句話說,為數組中的每個字符獲取“charCodeAt”。

function codesFromString(str) {
  var rv = [];
  for (var i = 0; i < str.length; ++i)
    rv.push(str.charCodeAt(i));
  }
  return rv;
}

這給你留下了一系列數字。 如果要將其作為CSV轉儲到頁面或其他內容上,可以使用join()

var csv = codeFromString(decoded).join(',');

編輯 - 好的,這是一個base64數字解碼器:

  var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split("");
  var base64inv = {}; 
  for (var i = 0; i < base64chars.length; i++) { 
    base64inv[base64chars[i]] = i; 
  }
  function decodeNumeric(s) {
    s = s.replace(new RegExp('[^'+base64chars.join("")+'=]', 'g'), "");

    var p = (s.charAt(s.length-1) == '=' ? 
            (s.charAt(s.length-2) == '=' ? 'AA' : 'A') : ""); 
    var r = []; 
    s = s.substr(0, s.length - p.length) + p;

    for (var c = 0; c < s.length; c += 4) {
      var n = (base64inv[s.charAt(c)] << 18) + (base64inv[s.charAt(c+1)] << 12) +
              (base64inv[s.charAt(c+2)] << 6) + base64inv[s.charAt(c+3)];

      r.push((n >>> 16) & 255);
      r.push((n >>> 8) & 255);
      r.push(n & 255);
    }
    return r;
  }

這適用於您的示例,但它表明您作為結果寫的內容實際上並不正確。 而不是“141,142,143,...”它是“141,0,0,0,142,0,0,0,143,0,0,0”等。這就是編碼字符串中那些“AAA”的運行。

(代碼來自http://en.wikibooks.org/wiki/Algorithm_Implementation/Miscellaneous/Base64

老話題,我知道,但你最后一個問題的答案在這里: http//sourceforge.net/apps/mediawiki/tiled/index.php?title = Examining_the_map_format

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM