【问题标题】:Qt-how to convert a QByteArray to structQt-如何将 QByteArray 转换为 struct
【发布时间】:2014-12-23 14:01:03
【问题描述】:

我需要将QByteArray 转换为结构。 我有这样的结构:

   struct mavlink_attitude_t
      {
          /// <summary> Timestamp (milliseconds since system boot) </summary>
            quint32 time_boot_ms;
              /// <summary> Roll angle (rad, -pi..+pi) </summary>
            float roll;
              /// <summary> Pitch angle (rad, -pi..+pi) </summary>
            float pitch;
              /// <summary> Yaw angle (rad, -pi..+pi) </summary>
            float yaw;
              /// <summary> Roll angular speed (rad/s) </summary>
            float rollspeed;
              /// <summary> Pitch angular speed (rad/s) </summary>
            float pitchspeed;
              /// <summary> Yaw angular speed (rad/s) </summary>
            float yawspeed;

      };

我有一个来自串口的QbyteArray。 我已经使用了 union,但我认为它不能用于 QByteArray。 还有其他方法吗?一个例子真的很有帮助。

【问题讨论】:

  • 如果您使用它在机器之间传输数据或保存到多台机器共享的文件。然后,如果两台机器的架构不同,这种方法将无法正常工作(例如 arm vs x86)。请参阅 QDataStream。

标签: c++ qt data-structures struct qbytearray


【解决方案1】:

你可以施放它:

QByteArray arr;
mavlink_attitude_t* m = reinterpret_cast<mavlink_attitude_t*>(arr.data());

【讨论】:

  • reinterpret_cast 应始终避免。它并不总是像你想的那样......我建议使用结构化的数据交换方式,例如一些消息传递库,如 protobuf、cap'n proto 或 QDataStream。它们都与平台、机器和编译器(!)无关。此解决方案取决于平台、机器和编译器。
  • @dom0:为什么要“始终”避免它?虽然通常不需要它,但有时它非常有用。此外,并非每个应用程序都希望是跨平台的。我的商业项目有意永远与编译器、机器和平台无关。
  • QDataStream 可用于序列化和使数据独立于平台。在另一个平台上发送和接收后,它适合这个新平台。所以我认为这种方法应该可行。
  • -1: .data() 以空值结尾 '\0'。如果 bytearray.at(0) == '\0' (例如 time_boot_ms=256) ,第一个字节是 '\0' 那么其余的都将不确定。
【解决方案2】:

接受的响应无效。 .data() 以空值结尾。
您有浮点数和整数,请使用左移。
示例:

mavlink_attitude_t.time_boot_ms = (bytearray.at(0) & 0xFFFF)      |
                                  (bytearray.at(1) & 0xFFFF) << 8 |
                                  (bytearray.at(2) & 0xFFFF) << 16|
                                  (bytearray.at(3) & 0xFFFF) << 24

如果您使用 Little endian,则反转索引。

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 2019-04-25
    • 2016-08-14
    • 2017-12-13
    • 1970-01-01
    • 2017-05-27
    • 2012-01-26
    • 2015-02-05
    相关资源
    最近更新 更多