编程语言
首页 > 编程语言> > javascript-将64位小端整数转换为数字

javascript-将64位小端整数转换为数字

作者:互联网

首先,我为这个愚蠢的问题感到抱歉,但是我是nodejs的新手.
我从一个套接字读取了一个64位的小的endian有符号整数,并将其放在Buffer上,所以让我说数字256表示为:

<Buffer 00 01 00 00 00 00 00 00>

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

谢谢

解决方法:

ECMA Section 8.5 – Numbers

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