我有一个包含8个字节的缓冲区对象。现在应将这八个字节解释为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);
答案 0 :(得分:7)
Javascript不支持64位整数,因为本机数字类型是64位双精度,只给出53位整数范围。
您可以创建32位数字的数组(即Uint32Array
),但如果有64位版本的数据,则无法将值复制到独立变量中。
答案 1 :(得分:2)
您可以使用node-int64
进行64位整数支持:
var Int64 = require('node-int64');
var int64 = new Int64(buff);
答案 2 :(得分:1)
遗憾的是,正确答案是Javascript不支持64位整数(到现在为止)。
因此,尝试将存储到您的8个字节中的精确64位整数转换为单个JS数字类型变量将失败。反正。
一些决定:
如果你不需要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);
(已编辑的问题)
否则,如果你需要64bit的“常用大值”并且你对11位低位(最右边2-3位的64位大值)的精确值不感兴趣,你可以这样使用:
// 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)
答案 3 :(得分:1)
由于 javascript 不支持 64 位整数,这里有一个对我有用的解决方案。这里我正在转换 8 字节 unix 时间戳。
inputString = "0000016b40d8ea30"
var buf = Buffer.from(inputString, 'hex');
timestamp = (parseInt(buf.toString("hex"),16).toString());
console.log(timestamp); //1560161086000
答案 4 :(得分:0)
答案 5 :(得分:0)
自从最新的Node.js v12.0.0起,您现在可以使用buf.readBigUInt64LE
:))