5

我有一个包含八个字节的缓冲区对象。这八个字节现在应该被解释为 64 位整数。

目前我使用以下算法:

var int = buff[0];

for (var i = 1; i < buff.length; i++) {
    int += (buff[i] * Math.pow(2, 8 * i));
}

console.log(int);

这行得通,但我相信有更好的方法(也许使用 Uint64Array)。

不幸的是,我在这里找不到 Uint16Array 如何帮助我。

问候

更新:

// puts two 32bit integers to one 64bit integer
var bufInt = (buf.readUInt32BE(0) << 8) + buf.readUInt32BE(4);
4

6 回答 6

7

Javascript 不支持 64 位整数,因为原生数字类型是 64 位双精度数,仅给出 53 位整数范围。

您可以创建 32 位数字的数组(即Uint32Array),但如果有 64 位版本的数组,则无法将值从其中复制到独立变量中。

于 2013-01-07T16:37:26.073 回答
3

您可以使用node-int6464 位整数支持:

var Int64 = require('node-int64');
var int64 = new Int64(buff);
于 2013-01-07T16:46:17.877 回答
3

由于最新的 Node.js v12.0.0,您现在可以使用buf.readBigUInt64LE:))

于 2019-04-24T10:49:55.623 回答
2

由于 javascript 不支持 64 位整数,这是一种对我有用的解决方案。这里我正在转换 8 字节 unix 时间戳。

inputString = "0000016b40d8ea30"    
var buf = Buffer.from(inputString, 'hex');
timestamp = (parseInt(buf.toString("hex"),16).toString());
console.log(timestamp); //1560161086000
于 2021-07-21T06:57:57.343 回答
1

遗憾的是,正确答案是 Javascript 不支持 64 位整数(直到现在)。

因此,尝试将精确的 64 位整数存储到您的 8 个字节中到单个 JS 数字类型变量中将失败。反正。

一些决定:

  1. 从 0 到 52 的精确位:

如果您不需要 64 位的高 11 位,并且足以处理精确的 53 位整数,则可以使用这种方式:

// puts up to 53 bits by 32bit integers to one "64bit" integer
var bufInt = (buf.readUInt32BE(0) & 0x001FFFFF) * 4294967296 + buf.readUInt32BE(4);

(已编辑问题)

  1. "64bit" int 可能会丢失低 11 位正确状态:

否则,如果您需要 64 位的“通用大值”,并且您对直到 11 个低位(巨大 64 位值的最右边 2-3 位)的精确值不感兴趣,您可以使用这种方式:

// puts 64 bit value by 32bit integers to one "64bit" integer
// with possible loose of lower 11 bits correctness
var bufInt = buf.readUInt32BE(0) * 4294967296 + buf.readUInt32BE(4);

对于那些对 Javascript 中的 int64(64 位整数支持)感兴趣的人,请注意!

看:

var x1 = 1 << 30;
var x2 = 1 << 31;
var x3 = 1 << 32;
var x4 = 1 << 33;
var a = 1240611072103715194;
var b = 1240611072103715193;
var c = 1240611072103700000;
alert(''
    + 'x1=' + x1 + ' (should =1073741824)\n' 
    + 'x2=' + x2 + ' (should =2147483648)\n' 
    + 'x3=' + x3 + ' (should =4294967296)\n' 
    + 'x4=' + x4 + ' (should =8589934592)\n' 
    + 'a=' + a + ' (should =1240611072103715194)\n' 
    + 'a-b=' + (a-b) + ' (should =1)\n'
    + 'a-c=' + (a-c) + ' (should =15194)\n'
);

RESULT:

x1=1073741824 (should =1073741824)
x2=-2147483648 (should =2147483648)
x3=1 (should =4294967296)
x4=2 (should =8589934592)
a=1240611072103715000 (should =1240611072103715194)
a-b=0 (should =1)
a-c=15104 (should =15194)
于 2017-07-31T21:32:43.333 回答
0

有一些模块可以提供 64 位整数支持:

也许您的问题可以使用其中一个库来解决。

于 2013-01-07T16:40:16.343 回答