首先,我很抱歉这个愚蠢的问题,但我是nodejs的新手。 我从套接字读取一个64位的小端符号整数,然后将它放在一个缓冲区上,所以假设我将数字256表示为:
<Buffer 00 01 00 00 00 00 00 00>
由于Buffer类只有readInt32LE和readUInt32LE,我如何使用32位操作将此缓冲区转换为等效的js数? 我应该读取两个32位大端数字,然后以某种方式按位或者它们?我应该读一下小端吗?
由于
答案 0 :(得分:3)
注意,幅度不大于2 53 的所有正整数和负整数都可以在Number类型中表示(实际上,整数0有两个表示,+ 0和-0)。
Javascript使用内部64位浮点数,这意味着您只能表示最多2个 53 或9007199254740992的数字。如果它没问题,您可以使用以下代码读取64位签名/ unsigned int into 64 bit float:
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));
}