2016-11-07 43 views
0

這是做我的頭ArrayBuffer瘋狂 - 如何讓二進制到arraybuffer

我有一個jquery ajax的職位從一個MySQL數據庫返回的輸出。一個字段是二進制的。我希望使用Javascript來處理這個二進制字段。我一直在周圍嘗試不同的方法,而這些方法似乎並不令人滿意,而且大多數都是路障。

我可以將數據傳遞給base64編碼,然後在Javascript中解碼。

數據是一個數據包,所以我希望使用DataView對它進行解碼,因爲它具有將數據視爲數據包(如C結構)的所有Get ...調用。

我已經嘗試過Blob和Typed Arrays,但是我去過的地方似乎只是不正確的事情。

我什麼後是這樣的:

var ab = new ArrayBuffer (atob(my_base64_encoded_packet_data) 
var dv = new DataView (ab); 

簡單!不,我設法親近的唯一方法是使用的FileReader,像這樣(大約):

fileReader.onload = function () { 
    var newBuf = this.result; 
    callback(newBuf); 
    return; 
}; 
fileReader.readAsArrayBuffer(buf); 

凡BUF是BLOB和newBuf是ArrayBuffer。

這是另一種做我想做的,但似乎勞動密集型的方法。

function str2ab(str) { 
    var buf = new ArrayBuffer(str.length); 
    var bufView = new Uint8Array(buf); 
    for (var i=0, var strLen=str.length; i<strLen; i++) { 
    bufView[i] = str.charCodeAt(i); 
    } 
    return buf; 
} 

請幫忙。謝謝

+0

文件讀取器的方法應該是做工精細,有什麼問題呢? –

回答

0

問題是你正在使用jQuery的ajax。 jQuery無法處理二進制文件,因爲它希望一切都是字符串。瀏覽器嘗試是聰明的它,並嘗試,如果你想獲得它作爲文本

改造響應你想要的是原始的二進制所以responseType要麼是arraybufferblob是你想要的。

解決方法是,堅持做手工或XHR使用新的方法獲取

fetch(url, opts).then(res => res.arrayBuffer()).then(buffer => { 
    // code here 
}) 

Sending and Receiving Binary Data - MDN