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