javascript-将64位小端整数转换为数字
作者:互联网
首先,我为这个愚蠢的问题感到抱歉,但是我是nodejs的新手.
我从一个套接字读取了一个64位的小的endian有符号整数,并将其放在Buffer上,所以让我说数字256表示为:
<Buffer 00 01 00 00 00 00 00 00>
由于Buffer类只有readInt32LE和readUInt32LE,如何使用32位操作将此缓冲区转换为等效的js编号?
我应该阅读两个32位大端数字,然后以某种方式按位还是它们?我应该给他们读小端字吗?
谢谢
解决方法:
Note that all the positive and negative integers whose magnitude is no greater than 253 are representable in the Number type (indeed, the integer 0 has two representations, +0 and −0).
Javascript内部使用64位浮点数,这意味着您只能精确地表示最大为253或9007199254740992的数字.如果可以,您可以使用以下代码将64位带符号/无符号int读取为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));
}
标签:node-js,endianness,buffer,javascript,64-bit 来源: https://codeday.me/bug/20191123/2064436.html