2010-07-14 24 views
4

我正在使用tiled來創建平鋪貼圖。 (Tiled是一個支持正交和等距地圖的瓷磚地圖編輯器)使用javascript解碼平鋪的base64數據時出錯解決方案

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

  • 正規的base64
  • 的base64 + gzip的
  • 的base64 + zlib的
  • 定期CSV

現在,我已經完全對的gzip放棄了(我的服務器gzips流量它反正,所以沒有損失那裏) 所以我想我會嘗試經常base64解碼,使用a base64 jquery plugin

但數據出來全是亂碼,就像這樣:

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

我想這是二進制編碼,但我怎麼周圍的得到什麼?

需要實施例的數據被解碼(定期的base64):

jQAAAI4AAACPAAAAkAAAAJEAAACSAAAAkwAAAKEAAACiAAAAowAAAKQAAAClAAAApgAAAKcAAAA= 

實施例的數據需要被解碼(gzip壓縮的base64):

H4sIAAAAAAAACw3DhwnAMAwAMP8P2Rdk9s1KoBQR2WK12R1Ol9vj9fn5A/luZ4Y4AAAA 

實施例的數據作爲CSV:

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

那麼我怎樣才能打開常規的base64編碼位並將其變成csv?

編輯:

利用該解決方案尖尖發現我有一個半正確的陣列。 然而,在數千個字符後,這兩個數字會再次出錯。之後更頻繁。

然後我發現有人在他的方案中也使用平鋪和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) 
    } 

我不知道爲什麼這是需要的,但至少它的工作原理。 如果有人能解釋,請做!

回答

3

試着按字符查看返回的字符串。換句話說,獲取數組中每個字符的「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 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'.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竊取代碼)

+0

工作。 雖然數組中只有每四個數字都是正確的。我可以遍歷這個,沒問題。 但是,在一定數量的數字後,他們又錯了。 Like:41,42,43,44,44,41,44,41,4096,12288 應該是:41,42,43,44,44,41,44,41,225,226,227 這是怎麼發生的? – skerit 2010-07-14 17:21:55

+1

嗯,它可能是base-64數據正在解碼,但隨後字符串值的Unicode性質正在得到你的方式。既然你真的想把這些字節當作原始數字值,那麼使用自定義的解碼器可能會更好。我正在玩一個Javascript base-64解碼器,就在幾天前。我會尋找它。 – Pointy 2010-07-14 17:44:55

+0

好的,謝謝! 因此,澄清:第522個數字是正確的。 – skerit 2010-07-14 18:05:37