如何使用 Buffer native API 从 Buffer 中读取时间戳?
How to read a timestamp from a Buffer using the Buffer native API?
背景
我正在使用 Node.js 本机缓冲区 API 读取缓冲区。此 API 有两个函数,称为 readUIntBE
和 readUIntLE
,分别用于 Big Endian 和 Little Endian。
https://nodejs.org/api/buffer.html#buffer_buf_readuintbe_offset_bytelength_noassert
问题
通过阅读文档,我偶然发现了以下几行:
- byteLength 要读取的字节数。必须满足:0 < byteLength <= 6.
这意味着我使用此函数一次只能读取 6 个字节,这对我的用例来说毫无用处,因为我需要读取由 8 个字节组成的时间戳。
最初我认为这是文档中的错字,但在得到@BridgeAR 的回复后很明显这是预期的行为:
他提到我可以通过添加偏移量来读取多个条目,但我不清楚如何做到这一点。
问题
- 如何通过连续添加偏移量来读取超过 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。就这些了。
希望对您有所帮助!
背景
我正在使用 Node.js 本机缓冲区 API 读取缓冲区。此 API 有两个函数,称为 readUIntBE
和 readUIntLE
,分别用于 Big Endian 和 Little Endian。
https://nodejs.org/api/buffer.html#buffer_buf_readuintbe_offset_bytelength_noassert
问题
通过阅读文档,我偶然发现了以下几行:
- byteLength 要读取的字节数。必须满足:0 < byteLength <= 6.
这意味着我使用此函数一次只能读取 6 个字节,这对我的用例来说毫无用处,因为我需要读取由 8 个字节组成的时间戳。
最初我认为这是文档中的错字,但在得到@BridgeAR 的回复后很明显这是预期的行为:
他提到我可以通过添加偏移量来读取多个条目,但我不清楚如何做到这一点。
问题
- 如何通过连续添加偏移量来读取超过 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。就这些了。
希望对您有所帮助!