如何从 node.js 10 中的缓冲区 read/write bigint?

How to read/write a bigint from buffer in node.js 10?

我看到节点 10 支持 BigInt。但是,缓冲区 class 中没有 ReadBigInt() 功能。

有没有可能绕过它?也许读取 2 个整数,将它们转换为 BigInt,移动上面的一个并添加它们以重建 bigint?

我最近也遇到了这样做的需要,并设法找到了这个 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,那么切片缓冲区应该可以工作。

对于 Node v12,添加了来自缓冲区的 functions for reading bigint,因此如果可能,您应该尝试使用 Node v12 或更高版本。

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

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

因此将这些方法修改为不是 class 方法可能看起来像这样

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

这里的派对有点晚了,但是作为 BigInt ctor accepts a hex string 我们可以将 Buffer 转换为十六进制字符串并将其传递给 BigInt ctor。这也适用于数字 > 2 ** 64 并且不需要任何依赖项。

function bufferToBigInt(buffer, start = 0, end = buffer.length) {
  const bufferAsHexString = buffer.slice(start, end).toString("hex");
  return BigInt(`0x${bufferAsHexString}`};
}