Я пытаюсь отправить двоичные данные на сервер. Это работает именно так, как мне нужно, в 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);
};
Мой двоичный объект оказывается вдвое длиннее, чем должен быть - что намекает на ваше упоминание о кодировании двух байтов за раз. Но я не совсем уверен, как это сделать (пока) ...