Как я могу публиковать двоичные данные в браузерах, которые не поддерживают типизированные массивы - PullRequest
4 голосов
/ 17 ноября 2011

Я пытаюсь отправить двоичные данные на сервер. Это работает именно так, как мне нужно, в 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);
};

Мой двоичный объект оказывается вдвое длиннее, чем должен быть - что намекает на ваше упоминание о кодировании двух байтов за раз. Но я не совсем уверен, как это сделать (пока) ...

...