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

将一个Int64BE从一个node.js缓冲区读入一个Number原语的最好方法是什么?比如readInt32BE读取一个Int32?

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

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; } 

不要尝试自己编码转换,请使用类似node-int64的testing版本。

 var Int64 = require('node-int64'); function readInt64BEasFloat(buffer, offset) { var int64 = new Int64(buffer, offset); return int64.toNumber(true); }