2012-02-01 51 views
0

我試圖讓這個遠程二進制文件讀取字節,當然這個字節會被置於範圍0..255之內。由於響應是以字符串形式給出的,我需要使用charCodeAt來獲取每個字符的數值。我碰到過這個問題,即charCodeAt以UTF8的形式返回值(如果我沒有弄錯),所以例如ASCII值139會被轉換爲8249.這會弄亂我的整個應用程序,因爲我需要從它們發送時獲取這些值服務器。在Javascript(Ajax)中檢索二進制數據

直接的解決方案是創建一個大開關,對於每個給定的UTF8代碼將返回相應的ASCII。但我想知道是否有更優雅更簡單的解決方案。提前致謝。

回答

1

一些字符編碼無關的格式下面的代碼已經從一個答案提取到這個StackOverflow question,應該幫助您解決您的問題。

function stringToBytesFaster (str) { 
    var ch, st, re = [], j=0; 
    for (var i = 0; i < str.length; i++) { 
     ch = str.charCodeAt(i); 
     if(ch < 127) 
     { 
      re[j++] = ch & 0xFF; 
     } 
     else 
     { 
      st = []; // clear stack 
      do { 
       st.push(ch & 0xFF); // push byte to stack 
       ch = ch >> 8;   // shift value down by 1 byte 
      } 
      while (ch); 
      // add stack contents to result 
      // done because chars have "wrong" endianness 
      st = st.reverse(); 
      for(var k=0;k<st.length; ++k) 
       re[j++] = st[k]; 
     } 
    } 
    // return an array of bytes 
    return re; 
} 

var str = "\x8b\x00\x01\x41A\u1242B\u4123C"; 

alert(stringToBytesFaster(str)); // 139,0,1,65,65,18,66,66,65,35,67 
1

我建議編碼的二進制數據是像的base64

+0

這將通過操縱數據從服務器端來完成,不是嗎?這種方法的問題是我不控制數據的來源,因爲它是一個遠程的外部服務器。那麼,實際上即時通過使用代理腳本繞過相同的原產地政策,所以我想我可以那樣做。但即時通訊設法避免這個原因,我想利用CORS機制。在這種情況下,我不能在數據到達瀏覽器之前觸摸數據。 – 2012-02-01 09:17:40