首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Uint8Array(8)张力

Uint8Array(8)张力
EN

Stack Overflow用户
提问于 2015-09-26 15:25:15
回答 2查看 941关注 0票数 1

由于IEEE 754,我无法将这个序列保持为一个数字,所以我从后端得到无符号64位整数到ArrayBuffer。有什么办法可以把这个庞大的数字“串”出来吗?

简而言之:

代码语言:javascript
复制
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); /// :-(

提前谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-26 15:38:14

是的,你可以压缩一个Int64,但是没有“内置”的方法,因为就像你说的那样,JavaScript数字是双精度浮动。

代码语言: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是从this answer here中提取的。

代码语言:javascript
复制
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;

票数 1
EN

Stack Overflow用户

发布于 2018-11-01 19:20:36

下面的DataView.getUint64()实现将尽可能精确地获得一个数字值:

How to Read 64-bit Integer from an ArrayBuffer / DataView in JavaScript

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32798768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档