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

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

目前我使用以下algorithm:

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

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

不幸的是,我无法find一个Uint16Array如何帮助我。

问候

更新:

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

JavaScript不支持64位整数,因为本机号码types是64位双精度型,只给出整数范围的53位。

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

您可以使用node-int64获得64位整数支持:

 var Int64 = require('node-int64'); var int64 = new Int64(buff); 

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

  • 节点BIGINT
  • bignum(基于OpenSSL)

也许你的问题可以用这些库中的一个来解决。

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

所以,试图把存储在你的8个字节中的确切的64位整数变成单个JS数字型variables将会失败。 无论如何。

一些决定:

  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. “64位”整数与可能的低位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' + 'ab=' + (ab) + ' (should =1)\n' + 'ac=' + (ac) + ' (should =15194)\n' ); RESULT: x1=1073741824 (should =1073741824) x2=-2147483648 (should =2147483648) x3=1 (should =4294967296) x4=2 (should =8589934592) a=1240611072103715000 (should =1240611072103715194) ab=0 (should =1) ac=15104 (should =15194)