从Node.js缓冲区读取INT64,并具有精确损失



从node.js buffer读取int64be的最佳方法是什么,例如readint32be读取int32?

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

JavaScript仅使用64位双精度浮子。要读取一个长数字,您必须读取两个32位整数,然后向左移动32位。另请注意,可能会出现不在9007199254740992< = x< = -9007199254740992的范围内的信息损失,因为内部表示使用1位为符号使用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:)

最新更新