【问题标题】:c++ parse two bytes to intc ++将两个字节解析为int
【发布时间】:2018-11-13 12:30:58
【问题描述】:

我通过 I2C 从传感器读取了两个字节,这些字节存储为 unsigned char。我确实知道哪个是最重要的字节,哪个是最不重要的字节。

unsigned char yawMSB;
unsigned char yawLSB;

如何将这两个字节的数据转换为一个 int

我已经在 C# 中使用

正确实现了这个
BitConverter.ToInt16(new byte[] { yawLSB, yawMSB }, 0)

【问题讨论】:

  • 如果目标类型是int16_t而不是float,你会怎么做?
  • 首先您需要阅读传感器的文档。字节中的值实际上代表什么?
  • 这些值代表eular 角。我已经在 C# 中使用:BitConverter.ToInt16(new byte[] { yawLSB, yawMSB }, 0)
  • 所以你的问题不在于浮点转换,而更多的是关于如何将两个 8 位整数值转换为一个 16 位整数值?
  • 哦,废话,你完全正确。不好,我会编辑问题。

标签: c++ int byte


【解决方案1】:

在 16 位整数中,高 8 位是最高字节,低 8 位是最低字节。

要使最高有效字节占据最高位,您需要将其值上移(8 位),这是通过左移位运算符<< 完成的。

然后要获得最低有效字节,您只需使用按位或| 添加低 8 位。

合起来就是yawMSB << 8 | yawLSB

【讨论】:

  • OP 可能想要一个 16 位有符号整数结果,当设置 yawMSB 的高位时,yawMSB << 8 + yawLS 不会处理。
【解决方案2】:

我知道哪个是最重要的字节,哪个是最不重要的字节。

  • MSB 表示Most 有效字节。
  • LSB 表示最小 有效字节。

如何将这两个字节的数据转换为一个浮点数?

然后您可以构建一个浮点数,其值为:

const float yaw = yawMSB << 8 + yawLSB;

实际上,yawMSB &lt;&lt; 8 + yawLSB 的值可能在您的实现定义的范围内。如果为真,并且是从0MAX_YAW 的线性标度,则应将值定义为:

const float yaw = float(yawMSB << 8 + yawLSB) / MAX_YAW; // gives yaw in [0.f, 1.f].

【讨论】:

  • 似乎问题已在两者之间进行了编辑。问题中不再有float
  • OP 可能想要一个 16 位有符号整数结果,当设置 yawMSB 的高位时,yawMSB &lt;&lt; 8 + yawLS 不会处理。
  • @EricPostpischil 我回答后问题的范围发生了变化。我保持原样是因为我很懒+ SPD的答案很好。
  • @YSC:即使在问题改变之前,yawMSB &lt;&lt; 8 + yawLSB 也可能有未定义的行为,因为如果int 是 16 位,它可能会溢出。
  • @EricPostpischil yawMSB &lt;&lt; 8 + yawLSB 未签名,不可能溢出。
猜你喜欢
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多