我正在使用Node.js缓冲区本机API读取缓冲区。此API分别为Big Endian和Little Endian提供了两个名为readUIntBE
和readUIntLE
的函数。
https://nodejs.org/api/buffer.html#buffer_buf_readuintbe_offset_bytelength_noassert
通过阅读文档,我偶然发现了以下几行:
这意味着我只能使用此函数一次读取6个字节,这使得它对我的用例无用,因为我需要读取由8个字节组成的时间戳。
最初我认为这是文档中的拼写错误,但在得到@BridgeAR的回复之后,显然这是预期的行为:
他提到我可以通过添加偏移来读取多个条目,但我不清楚如何做到这一点。
答案 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。这是关于它的。
希望它有所帮助!