代码之家  ›  专栏  ›  技术社区  ›  Jay

如何从node.js 10中的缓冲区读/写bigint?

  •  0
  • Jay  · 技术社区  · 6 年前

    我看到节点10支持BigInt。但是,Buffer类中没有ReadBigInt()功能。

    1 回复  |  直到 6 年前
        1
  •  3
  •   oBusk    4 年前

    对于节点v12, functions for reading bigint 如果可能的话,您应该尝试使用节点v12或更高版本。

    但是这些函数只是基于从缓冲区中读取整数的纯数学函数,所以您几乎可以将它们复制到节点10-11代码中。

    https://github.com/nodejs/node/blob/v12.6.0/lib/internal/buffer.js#L78-L152

    因此,将这些方法修改为非类方法可能看起来像这样

    function readBigUInt64LE(buffer, offset = 0) {
      const first = buffer[offset];
      const last = buffer[offset + 7];
      if (first === undefined || last === undefined) {
        throw new Error('Out of bounds');
      }
    
      const lo = first +
        buffer[++offset] * 2 ** 8 +
        buffer[++offset] * 2 ** 16 +
        buffer[++offset] * 2 ** 24;
    
      const hi = buffer[++offset] +
        buffer[++offset] * 2 ** 8 +
        buffer[++offset] * 2 ** 16 +
        last * 2 ** 24;
    
      return BigInt(lo) + (BigInt(hi) << 32n);
    }
    

    编辑:对于其他有相同问题的人,我为此创建了一个包。

    https://www.npmjs.com/package/read-bigint

        2
  •  4
  •   MinusGix    6 年前

    我最近也遇到了这样做的需要,并设法找到了这个npm库: https://github.com/no2chem/bigint-buffer ( https://www.npmjs.org/package/bigint-buffer )它可以作为BigInt从缓冲区读取。
    示例用法(阅读本文,链接的github/npm上有更多示例):

    const BigIntBuffer = require('bigint-buffer');
    
    let testBuffer = Buffer.alloc(16);
    testBuffer[0] = 0xff; // 255
    
    console.log(BigIntBuffer.toBigIntBE(testBuffer));
    // -> 338953138925153547590470800371487866880n
    

    它将从缓冲区中读取16字节(128位)的数字。 如果您希望将它的一部分作为BigInt读取,那么切片缓冲区应该可以工作。