2016-11-07 38 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