我正在尝试将二进制数据发布到服务器。这完全符合我的需要,在 Chrome 15 中:
XMLHttpRequest.prototype.sendAsBinary = function(datastr) {
function byteValue(x) {
return x.charCodeAt(0) & 0xff;
}
var ords = Array.prototype.map.call(datastr, byteValue);
var ui8a = new Int8Array(ords);
this.send(ui8a.buffer);
};
但是,我需要它在某些不支持 Int8Array 类型(或 Blob)的浏览器中工作。
也许解决方案是创建我自己的 ArrayBuffer 实现(ui8a.buffer 是一个 ArrayBuffer)。问题是,我不知道这个对象是什么;在 JavaScript 控制台上检查它只显示一个 byteLength 属性。
更新:我觉得我快要接近了,但我的转换不正确。这是我正在尝试的:
XMLHttpRequest.prototype.sendAsBinary = function(datastr) {
var blob;
function byteValue(x) {
return x.charCodeAt(0) & 0xff;
}
var ords = Array.prototype.map.call(datastr, byteValue);
if (window.Int8Array) {
var ui8a = new Int8Array(ords);
blob = ui8a.buffer;
} else {
var strArray = Array.prototype.map.call(ords, function(x) {
if (x > 127) x = x-256;
return String.fromCharCode(x);
});
blob = strArray.join();
}
this.send(blob);
};
我的 blob 最终的长度是它应该长度的两倍——这暗示了你提到一次编码两个字节。但我真的不知道该怎么做(还)......