3

首先,我很抱歉这个愚蠢的问题,但我是 nodejs 的新手。我从套接字读取了一个 64 位小端有符号整数,并将其放在缓冲区中,所以假设我将数字 256 表示为:

<Buffer 00 01 00 00 00 00 00 00>

由于 Buffer 类只有 readInt32LE 和 readUInt32LE 我如何使用 32 位操作将此缓冲区转换为其等效的 js 编号?我应该读取两个 32 位大端数,然后以某种方式按位还是它们?我应该读他们的小端序吗?

谢谢

4

1 回答 1

3

ECMA 第 8.5 节 - 数字

请注意,所有大小不大于 2 53的正整数和负整数都可以用 Number 类型表示(实际上,整数 0 有两种表示形式,+0 和 -0)。

Javascript 在内部使用 64 位浮点数,这意味着您只能精确表示不超过 2 53或 9007199254740992 的数字。如果您可以,您可以使用以下代码将 64 位有符号/无符号整数读入 64 位浮点数:

function readUInt64(buff, offset) {
  return buff.readInt32LE(offset) + 0x100000000*buff.readUInt32LE(offset + 4);
}

function readInt64(buff, offset) {
   var word0 = buff.readUInt32LE(offset);
   var word1 = buff.readUInt32LE(offset+4);
   if (!(word1 & 0x80000000))
      return word0 + 0x100000000*word1;
   return -((((~word1)>>>0) * 0x100000000) + ((~word0)>>>0) + 1);
}

如果您需要精确表示 - 使用bignumber.js

function readUInt64(buff, offset) {
   var word0 = buff.readUInt32LE(offset);
   var word1 = buff.readUInt32LE(offset+4);
   return new BigNumber(word0).plus(new BigNumber(word1).times(0x100000000));
}
于 2013-07-17T00:48:49.653 回答