从node.js缓冲区读取Int64BE到Number原语的最佳方法是什么,比如readInt32BE读取Int32?
我知道我会用数字+/- 9'007'199'254'740'992失去精确度,但我不会在我想要实现的协议中获得如此高的数字。
答案 0 :(得分:7)
Javascript仅使用64位双精度浮点数。要读取一个长数字,您必须读取两个32位整数并将高32位向左移位。另请注意,由于内部表示使用1位作为符号,使用11位作为指数,因此可能存在长度值不在9007199254740992< = x< = -9007199254740992范围内的信息丢失。
由于低部分可以是负数但必须被视为无符号,因此会添加更正。
function readInt64BEasFloat(buffer, offset) {
var low = readInt32BE(buffer, offset + 4);
var n = readInt32BE(buffer, offset) * 4294967296.0 + low;
if (low < 0) n += 4294967296;
return n;
}
答案 1 :(得分:5)
请勿尝试自行编码转化,请使用经过测试的版本,例如node-int64
。
var Int64 = require('node-int64');
function readInt64BEasFloat(buffer, offset) {
var int64 = new Int64(buffer, offset);
return int64.toNumber(true);
}
答案 2 :(得分:1)
在最新的Node.js(12.0.0)中,您可以使用buf.readBigInt64BE
:))