首先,我很抱歉这个愚蠢的问题,但我是 nodejs 的新手。我从套接字读取了一个 64 位小端有符号整数,并将其放在缓冲区中,所以假设我将数字 256 表示为:
<Buffer 00 01 00 00 00 00 00 00>
由于 Buffer 类只有 readInt32LE 和 readUInt32LE 我如何使用 32 位操作将此缓冲区转换为其等效的 js 编号?我应该读取两个 32 位大端数,然后以某种方式按位还是它们?我应该读他们的小端序吗?
谢谢
首先,我很抱歉这个愚蠢的问题,但我是 nodejs 的新手。我从套接字读取了一个 64 位小端有符号整数,并将其放在缓冲区中,所以假设我将数字 256 表示为:
<Buffer 00 01 00 00 00 00 00 00>
由于 Buffer 类只有 readInt32LE 和 readUInt32LE 我如何使用 32 位操作将此缓冲区转换为其等效的 js 编号?我应该读取两个 32 位大端数,然后以某种方式按位还是它们?我应该读他们的小端序吗?
谢谢
请注意,所有大小不大于 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));
}