【问题标题】:NestJS Microservices (MQTT Transporter) reveive hex data as BufferNestJS 微服务(MQTT 传输器)将十六进制数据作为缓冲区接收
【发布时间】:2021-05-17 02:49:05
【问题描述】:

NestJS 在底层使用 MQTT.js 进行基于 MQTT 的通信(据我所知)。我正在尝试将十六进制数据作为缓冲区接收,但接收到的数据总是被解码为文本。我无法正确编码以获取发送的十六进制数据。我尝试了很多编码方案。

有没有办法告诉 NestJS 数据不应该被解码为文本?

例子:

一个客户端发布 0xfa。另一个客户端(NestJS 应用程序)监听这个主题并接收一个字符串,在这种情况下是一个不可打印的字符。当我尝试使用Buffer.from(message, 'utf-8') 将其转换回缓冲区时,我得到 0xefbfbd。将其转换回来,例如Buffer.from(message, 'ascii') 结果为 0xfd。

从 0x80 到 0xff 的十六进制数据会出现这个问题,因为我猜它不是标准化的(ascii 例如从 0x00 到 0x7f 标准化)。因此,当我尝试发送 0x01 时,我可以毫无问题地接收一个字符并将其转换回 0x01 与 Buffer.from(message, 'utf-8')Buffer.from(message, 'ascii')

【问题讨论】:

  • 你介意添加一些例子来复制这个吗?因为,如果我按原样阅读问题,您应该能够将其转换为带有 Buffer.from('68656c6c6f', 'hex').toString('utf-8') 之类的文本。它应该返回一个字符串hello
  • 当然,我编辑了上面的帖子,让大家更清楚。提前致谢!
  • hmmm,我不知道客户端以什么格式推送数据。但是,假设它是十六进制的,那么我想你需要与客户核实。因为你是对的,它应该是从 00 到 7f。看了这个,感觉应该是从hex转成ascii(而不是直接转成ascii)
  • 我可以解决这个问题。处理事件的函数接收的上下文参数包含缓冲区。非常感谢!

标签: javascript nestjs


【解决方案1】:

我认为问题可以归结为 NodeJS 中的 Buffer?查看在 Node REPL 中执行的这些示例:

Buffer.from(Buffer.from([0,1,128]).toString(), 'ascii') //

Buffer.from(Buffer.from([0,1,128]).toString(), 'utf-8') //

在这里可以清楚地看到,十进制的 128(即 0x80)不知何故“丢失”/以错误的方式转换回来。

【讨论】:

  • 更好的例子:Buffer.from(Buffer.from([0x0,0x1,0x80]).toString(), 'ascii') //
  • Buffer.from(Buffer.from([0x0,0x1,0x80]).toString('ascii'), 'ascii') //
【解决方案2】:

解决方案:处理事件的函数接收的上下文参数包含缓冲区。见https://docs.nestjs.com/microservices/mqtt#context

【讨论】:

    猜你喜欢
    • 2019-04-20
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 2016-04-30
    • 2012-02-20
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多