[英]Trouble decoding tiled base64 data with javascript
我正在使用平鋪來創建平鋪地圖。 (Tiled是一個瓦片地圖編輯器,支持正交和等距地圖)
它將地圖保存在XML文件中。 它可以使用某些編碼結構:
現在,我已經完全放棄了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.