繁体   English   中英

Uint8Array(8)字符串化

[英]Uint8Array(8) stringification

由于IEEE 754,我无法从后端将无符号的64位整数获取到ArrayBuffer中,因此无法将此序列保持为Number。 有什么办法可以“串化”这个庞大的数字吗?

简而言之:

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); /// :-(

先感谢您。

是的,您可以对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。

 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; 

下面的DataView.getUint64()实现将为您提供一个数值精度DataView.getUint64()的数字:

如何从JavaScript中的ArrayBuffer / DataView读取64位整数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM