如何读取缓冲区的前 n 个字节并在 NodeJS 中转换为字符串?

Posted

技术标签:

【中文标题】如何读取缓冲区的前 n 个字节并在 NodeJS 中转换为字符串?【英文标题】:How to read first n bytes of buffer and convert to string in NodeJS? 【发布时间】:2019-11-01 11:16:44 【问题描述】:

我有一个通过网络发送并作为缓冲区到达我的服务器的字符串。它已被格式化为我自己的自定义协议(理论上,尚未实现)。我想将前 n 个字节用于标识协议的字符串。

我已经完成了:

data.toString('utf8');

在整个缓冲区上,但这只是将整个数据包作为字符串提供给我,这不是我想要实现的。

收到消息后,如何将字节的子集转换为字符串?

提前致谢

【问题讨论】:

这不是你要问的,所以我不会把它作为答案发布......但万一有人来到这里(比如我),因为他们用谷歌搜索了“nodejs 如何首先阅读” n bytes of a buffer":缓冲区只是一个字节数组,因此您可以使用简单的数组表示法访问。 b[0] 是第一个字节,表示为 0 到 255 之间的无符号整数。 【参考方案1】:

找出方法。

您必须通过在原始缓冲区上调用方法复制来将所需的字节数复制到另一个缓冲区,即:

sourceBuffer.copy(targetBuffer, targetStartIndex, sourceStartIndex, sourceEndIndex)

这将为您的 targetBuffer 提供所需的数据,然后您可以调用 toString() 或任何其他方法将缓冲区数组转换为所需的数据类型。

【讨论】:

【参考方案2】:

Buffer.toString() 方法接受 startend 参数,您可以使用它们来切出您想要的子字符串的子集。根据您的实施,这可能比您在答案中建议的分配新的中介 Buffer 更快。

查看 Node 的 Buffer.toString() 方法了解更多信息。

【讨论】:

哦,我太笨了。但我想我仍然会使用我的方法,因为我为包含方法的 Buffer 类创建了一个包装类。但是谢谢,也许我可以对该类进行调整以使用 Buffer.toString 方法【参考方案3】:

我知道我有点晚了,但为什么不只是这样:

buffer.subarray(0, bytes).toString();

【讨论】:

以上是关于如何读取缓冲区的前 n 个字节并在 NodeJS 中转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

golang net/http包 http请求的字节码读取与解析。

如何在 async_read_until 之后使用 asio 缓冲区进行连续读取

从 golang 中的缓冲读取器读取特定数量的字节

如何从 Wasm 内存缓冲区中读取元组结构?

html5 fileReader -- 如何只读取文件的前 N ​​个字符?

NodeJS读取缓冲区二进制文件以浮动