【问题标题】:How to read a timestamp from a Buffer using the Buffer native API?如何使用 Buffer 原生 API 从 Buffer 中读取时间戳?
【发布时间】:2018-04-24 13:14:19
【问题描述】:

背景

我正在使用 Node.js 缓冲区原生 API 读取缓冲区。该 API 有两个函数,分别称为 readUIntBEreadUIntLE,分别用于 Big Endian 和 Little Endian。

https://nodejs.org/api/buffer.html#buffer_buf_readuintbe_offset_bytelength_noassert

问题

通过阅读文档,我偶然发现了以下几行:

  • byteLength 要读取的字节数。必须满足:0

这意味着我使用此函数一次只能读取 6 个字节,这对于我的用例来说毫无用处,因为我需要读取由 8 个字节组成的时间戳。

最初我认为这是文档中的错字,但在得到@BridgeAR 的回复后,很明显这是预期的行为:

他提到我可以通过添加偏移量来读取多个条目,但我不清楚如何做到这一点。

问题

  1. 如何通过不断添加偏移量来读取超过 6 个字节长的时间戳?

【问题讨论】:

    标签: node.js buffer


    【解决方案1】:

    回答

    简单地说,你不能。无论如何都不要使用本机 Buffer API。

    为什么?

    由于 Javascript 仅支持精度高达 53 位的数字,因此不支持 8 字节数字(即 64 位)。因此,任何从长度大于 6 字节的 Buffer 中读取数字的尝试都将导致精度损失并且不可靠。

    我能做什么?

    您需要使用第 3 方库进行计算并显示这些数字。

    我是怎么做到的?

    在我的例子中,由于我只需要打印出数字(时间戳)而不会损失任何精度,并且我不需要对其进行计算,因此我使用了这个库:

    https://www.npmjs.com/package/int64-buffer

    然后就变得简单了。通过 3 个步骤,我可以打印我的时间戳而不会损失任何精度,假设我有一个缓冲区 buf,其中包含我的 8 字节数字的任意长度:

    const Uint64BE = require("int64-buffer").Uint64BE;
    const numberBytes = buff.slice( 0, 8 );
    cons number = new Uint64BE( numberBytes );
    console.log( number.toString() );
    

    警告

    如果你需要对这些号码进行操作,我建议在 Github 讨论https://github.com/nodejs/help/issues/1231 进行评分

    此外,您需要知道您的数字是 LE 还是 BE。就是这样。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      相关资源
      最近更新 更多