从node.js缓冲区读取int64,精度损失

时间:2012-12-22 10:55:24

标签: javascript node.js int64

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

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

3 个答案:

答案 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:))