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

I see that BigInt is supported in node 10. However, there's no ReadBigInt() functionality in the Buffer class.

Is it possible to somehow go around it? Perhaps read 2 ints, cast them to BigInt, shift the upper one and add them to reconstruct the bigint?



Solution 1:[1]

With Node v12, functions for reading bigint from buffers was added, so if possible, you should try to use Node v12 or later.

But these functions are just pure math based on reading integers from the buffer, so you can pretty much copy them into your Node 10-11 code.

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

So modifying these methods to not be class methods could look something like this

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);
}

EDIT: For anyone else having the same issue, I created a package for this.

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

Solution 2:[2]

I recently had encountered the need to do this as well, and managed to find this npm library: https://github.com/no2chem/bigint-buffer ( https://www.npmjs.org/package/bigint-buffer ) which can read from a buffer as a BigInt.
Example Usage (reading, there is more examples on the linked github/npm):

const BigIntBuffer = require('bigint-buffer');

let testBuffer = Buffer.alloc(16);
testBuffer[0] = 0xff; // 255

console.log(BigIntBuffer.toBigIntBE(testBuffer));
// -> 338953138925153547590470800371487866880n

That will read the 16byte (128bit) number from the buffer. If you wish to read only part of it as a BigInt, then slicing the buffer should work.

Solution 3:[3]

A little late to the party here, but as the BigInt ctor accepts a hex string we can just convert the Buffer to a hex string and pass that in to the BigInt ctor. This also works for numbers > 2 ** 64 and doesn't require any dependencies.

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 MinusGix
Solution 3