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);
};

私のブロブは、本来あるべき長さの 2 倍になってしまいます。これは、一度に 2 バイトをエンコードするというあなたの言及を示唆しています。しかし、私はそれを行う方法が本当にわかりません(まだ)...

4

0 に答える 0