如何使用 Buffer native API 从 Buffer 中读取时间戳?

How to read a timestamp from a Buffer using the Buffer native API?

背景

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

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

问题

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

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

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

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

问题

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

回答

简单地说,你不能。不使用 原生缓冲区 API 无论如何。

为什么?

因为Javascript只支持最多53位精度的数字,不支持8字节的数字(有64位)。因此,任何从长度大于 6 字节的缓冲区中读取数字的尝试都会导致精度损失并且不可靠。

我能做什么?

您需要使用第 3 方库来进行计算并显示此类数字。

我是怎么做到的?

在我的例子中,因为我只需要在不损失任何精度的情况下打印出数字 ( timestamp ),而且我不需要对其进行 运行 计算,所以我使用了这个库:

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。就这些了。

希望对您有所帮助!