JavaScript:读取8个字节到64位整数

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

1
你想用这个64位数做什么? - Alnitak
当你提出问题时,你并没有真正说明你所谓的“更好的方法”,但如果你担心性能问题,使用位移操作而不是使用Math.Pow可能会提供一些改进。(哎呀!看来不是这样...请查看下一个评论!) - Beska
1
@Beska 在 JS 中,位移(和按位布尔运算)仅适用于 32 位范围。 - Alnitak
1
@alnitak 很有趣!好的,我想我会让这个评论保留在那里,这样其他可能不知道的人就不会掉进同样的陷阱了。 - Beska
好的,那我就保持这样。@Alnitak 只是一些流解析 ;) - bodokaiser
6个回答

7

Javascript不支持64位整数,因为原生数字类型是一个64位双精度浮点型,只提供53个整数范围。

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


4
自最新的Node.js v12.0.0版本起,您现在可以使用buf.readBigUInt64LE:))

3
你可以使用node-int64来支持64位整数:
var Int64 = require('node-int64');
var int64 = new Int64(buff);

2

由于 JavaScript 不支持 64 位整数,所以这里提供一种适用于我自己的解决方案。我将转换一个 8 字节的 Unix 时间戳。

inputString = "0000016b40d8ea30"    
var buf = Buffer.from(inputString, 'hex');
timestamp = (parseInt(buf.toString("hex"),16).toString());
console.log(timestamp); //1560161086000

1
很遗憾,正确的答案是JavaScript目前不支持64位整数。
因此,试图将确切的64位整数存储到一个JS数字类型变量的8个字节中将失败。无论如何。
一些决定:
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. 可能会丢失低11位正确状态的"64位"整数:

否则,如果您需要一个常见的64位大值,并且您不关心巨大64位值的最低11位(最右侧的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)

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接