【问题标题】:How to read/write a bigint from buffer in node.js 10?如何从 node.js 10 中的缓冲区读取/写入 bigint?
【发布时间】:2019-03-06 19:17:06
【问题描述】:

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

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

【问题讨论】:

    标签: node.js buffer bigint


    【解决方案1】:

    我最近也遇到了这样做的需要,并设法找到了这个 npm 库:https://github.com/no2chem/bigint-buffer (https://www.npmjs.org/package/bigint-buffer),它可以作为 BigInt 从缓冲区读取。
    Example Usage(阅读,链接的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 读取,那么切片缓冲区应该可以工作。

    【讨论】:

    • 我也找到了,感谢回复。如果它是 8 个字节,你能详细说明如何取出 bigint 吗?干杯
    • @Jay 我所做的是获取缓冲区的一部分(startOffset,startOffset+8),然后在console.log 中使用上述方法读取 int64。
    【解决方案2】:

    对于 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

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

    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

    【讨论】:

    • 据说节点12在2019年10月22日成为活动版本nodejs.org/en/about/releases
    • 我觉得有错别字,this[++offset] 应该是buffer[++offset]
    • @AlbaMendez 你是对的!我更新了代码以匹配
    猜你喜欢
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2019-02-28
    • 2020-11-11
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多