2

将 Int64BE 从 node.js 缓冲区读取到 Number 原语中的最佳方法是什么,例如 readInt32BE 读取 Int32?

我知道我会失去数字 +/- 9'007'199'254'740'992 的精度,但我不会在我想要实现的协议中得到如此高的数字。

4

3 回答 3

8

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;
}
于 2012-12-22T11:12:02.457 回答
5

不要尝试自己编写转换代码,请使用经过测试的版本,例如node-int64.

var Int64 = require('node-int64');
function readInt64BEasFloat(buffer, offset) {
  var int64 = new Int64(buffer, offset);
  return int64.toNumber(true);
}
于 2012-12-22T15:00:50.980 回答
3

在最新的 Node.js (12.0.0) 中,您可以使用buf.readBigInt64BE:))

于 2019-04-24T10:48:00.393 回答