1

バックエンドから ArrayBuffer に符号なし 64 ビット整数を取得しています。IEEE 754 が原因で、このシーケンスを数値として取得して保持することはできません。この膨大な数を「文字列化」する方法はありますか?

手短に:

var buffer = new ArrayBuffer(8);
var raw = new Uint8Array(buffer);

raw[0] = 255;
raw[1] = 255;
raw[2] = 255;
raw[3] = 255;
raw[4] = 255;
raw[5] = 255;
raw[6] = 255;
raw[7] = 255;

var view = new DataView(buffer);
var result = view.getUint64(0); /// :-(

前もって感謝します。

4

2 に答える 2

1

はい、Int64を文字列化できますが、JavaScriptの数値は倍精度浮動小数点数であるため、それを行う「組み込み」の方法はありません。

// ...
function readInt64(view){
    var small = view.getUint32(0).toString(16); // present as base 16 string
    var large = view.getUint32(1).toString(16);
    // in a power-of-2  base it's just a string concat to add them
    var bigNumber = large + small; 
    return h2d(bigNumber);
}

h2d は、この回答 hereから取得されます。

function h2d(s) {
    // https://stackoverflow.com/a/12533838/1348195
    function add(x, y) {
        var c = 0, r = [];
        var x = x.split('').map(Number);
        var y = y.split('').map(Number);
        while(x.length || y.length) {
            var s = (x.pop() || 0) + (y.pop() || 0) + c;
            r.unshift(s < 10 ? s : s - 10); 
            c = s < 10 ? 0 : 1;
        }
        if(c) r.unshift(c);
        return r.join('');
    }

    var dec = '0';
    s.split('').forEach(function(chr) {
        var n = parseInt(chr, 16);
        for(var t = 8; t; t >>= 1) {
            dec = add(dec, dec);
            if(n & t) dec = add(dec, '1');
        }
    });
    return dec;
}
function readInt64(view, i){
    var small = view.getUint32(0 + 2 * i).toString(16); // present as base 16 string
    var large = view.getUint32(1 + 2 * i).toString(16);
    // in a power-of-2  base it's just a string concat to add them
    var bigNumber = large + small; 
    return h2d(bigNumber);
}

var buffer = new ArrayBuffer(8);
var raw = new Uint8Array(buffer);

raw[0] = 255;
raw[1] = 255;
raw[2] = 255;
raw[3] = 255;
raw[4] = 255;
raw[5] = 255;
raw[6] = 255;
raw[7] = 255;

var view = new DataView(buffer);
var result = readInt64(view, 0);
document.body.innerHTML = result;

于 2015-09-26T15:38:14.287 に答える
0

以下のDataView.getUint64()実装では、現在可能な限りの精度で数値を取得します。

JavaScript で ArrayBuffer / DataView から 64 ビット整数を読み取る方法

于 2018-11-01T19:20:36.947 に答える