Как читать / записывать bigint из буфера в node.js 10? - PullRequest
0 голосов
/ 01 октября 2018

Я вижу, что BigInt поддерживается в узле 10. Однако в классе Buffer нет функции ReadBigInt ().

Можно ли как-то обойти это?Возможно, прочитайте 2 целых, приведите их к BigInt, сдвиньте верхний и добавьте их, чтобы восстановить bigint?

Ответы [ 2 ]

0 голосов
/ 14 июля 2019

С Node v12, были добавлены функции для чтения bigint из буферов, поэтому, если возможно, вы должны попробовать использовать Node v12 или более позднюю версию.

Но эти функции основаны исключительно на математике.при чтении целых чисел из буфера, так что вы можете в значительной степени скопировать их в код Node 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 = this[++offset] +
    buffer[++offset] * 2 ** 8 +
    buffer[++offset] * 2 ** 16 +
    last * 2 ** 24;

  return BigInt(lo) + (BigInt(hi) << 32n);
}
0 голосов
/ 16 октября 2018

Недавно я столкнулся с необходимостью сделать это, и мне удалось найти эту библиотеку 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, тогда срезы буфера должны работать.

...