【问题标题】:How to reconstruct a 4 byte uint8 array into a uint32 integer如何将 4 字节 uint8 数组重构为 uint32 整数
【发布时间】:2021-12-08 22:51:08
【问题描述】:

我有一个需要向 arduino(ESP32) 发送 12 位值 (0x7DF) 的网络应用程序 (javascript)。 我有一个只接受 Uint8_t 有效负载的 websocket 连接,因此我将值拆分为 4 个字节(Uint8_t)。 我可以将数组发送到 arduino,但我如何将它重建为 32 位值?

这是我用来将其转换为字节的代码:

const uInt32ToBytes = (input) => {
  const buffer = Buffer.alloc(4)
  buffer.writeUInt32BE(input, 0)
  return [
    buffer[0],
    buffer[1],
    buffer[2],
    buffer[3]
  ]
}

//With an input of 0x7DF i get an output of [0, 0, 7, 223]

我尝试了很多其他问题中给出的选项,但都没有奏效。这是他们的建议:

uint32_t convertTo32(uint8_t * id) {
  uint32_t bigvar = (id[0] << 24) + (id[1] << 16) + (id[2] << 8) + (id[3]);
  return bigvar;
}
//This returns an output of 0. 

感谢任何帮助 编辑:我的转换函数有一个测试变体,而不是原始解决方案。解决了这个问题。

【问题讨论】:

  • 您以大端序写入缓冲区,但使用小端序算法重构整数。
  • @Passerby 这应该会产生不正确的结果,但不会产生0
  • @passerby 无论哪种方式都返回 0。我在想也许我错了,所以我试着去 LE,但同样的反应。我会在 OP 中改回来
  • 我猜他后来提取低位 12 位时得到了0,因为这就是他想发送给 Arduino 的内容。所以你可能是对的。解决方案就是在 JS 或 C++ 代码中反转索引。
  • 他的答案有效,所以我将其标记为最佳答案

标签: javascript c++ uint8t uint32


【解决方案1】:

在 Arduino 上,ints 是 16 位的,所以 id[0] &lt;&lt; 24(将 id[0]uint8_t 提升到 int)是未定义的(并且无论如何都无法保持该值,使其成为总是 0)。

你需要事先做一些演员表:

return (static_cast<uint32_t>(id[0]) << 24)
     | (static_cast<uint32_t>(id[1]) << 16)
     | (static_cast<uint32_t>(id[2]) << 8)
     | (static_cast<uint32_t>(id[3]));

【讨论】:

  • 你说得有道理,但我认为该架构中的 int 大小无关紧要,因为 id[0] 仍然是 uint8_t 并且将对其应用移位运算符,而无需强制转换为诠释。
  • 这非常有效。你是神。谢谢。
  • @Jellyboy &lt;&lt; 提前提升了它的两个参数(这就是为什么这会在 32 位整数的系统上“工作”)
  • 你是对的,刚刚在 Godbolt 上测试过。 gcc.godbolt.org/z/5s391bEsf
猜你喜欢
  • 2011-09-23
  • 2021-08-20
  • 2019-10-18
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多