如何使用Buffer本机API从Buffer读取时间戳?

时间:2018-04-24 13:14:20

标签: node.js buffer

背景

我正在使用Node.js缓冲区本机API读取缓冲区。此API分别为Big Endian和Little Endian提供了两个名为readUIntBEreadUIntLE的函数。

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

问题

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

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

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

最初我认为这是文档中的拼写错误,但在得到@BridgeAR的回复之后,显然这是预期的行为:

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

问题

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

1 个答案:

答案 0 :(得分:0)

答案

简单地说,你不能。无论如何都不使用 原生Buffer API。

为什么?

由于Javascript仅支持最高53位精度的数字,因此不支持8字节数字(具有64位)。因此,任何从长度超过6个字节的缓冲区读取数字的尝试都将导致精度损失并且不可靠。

我该怎么办?

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

我是怎么做到的?

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

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。这是关于它的。

希望它有所帮助!