4

我正在尝试将二进制数据发布到服务器。这完全符合我的需要,在 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 最终的长度是它应该长度的两倍——这暗示了你提到一次编码两个字节。但我真的不知道该怎么做(还)......

4

0 回答 0