C++ Qt如何将QByteArray转换为struct

C++ Qt如何将QByteArray转换为struct,c++,qt,data-structures,struct,qbytearray,C++,Qt,Data Structures,Struct,Qbytearray,我需要将QByteArray转换为结构。 我有一个这样的结构: struct mavlink_attitude_t { /// <summary> Timestamp (milliseconds since system boot) </summary> quint32 time_boot_ms; /// <summary> Roll angle (rad, -pi..+

我需要将
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;

      };
struct mavlink\u态度
{
///时间戳(系统启动后的毫秒)
32次开机时间;
///横滚角(弧度,-pi..+pi)
浮动辊;
///俯仰角(rad,-pi..+pi)
浮动螺距;
///偏航角(rad,-pi..+pi)
浮动偏航;
///滚转角速度(rad/s)
浮动辊速度;
///俯仰角速度(rad/s)
浮动俯仰速度;
///偏航角速度(rad/s)
浮动雅司比;
};
我有一个
QbyteArray
来自串行端口。 我已经使用了union,但我认为它不能用于
QByteArray
。 还有别的办法吗?举个例子真的很有帮助。

你可以将其转换为:

QByteArray arr;
mavlink_attitude_t* m = reinterpret_cast<mavlink_attitude_t*>(arr.data());
QByteArray-arr;
mavlink_姿态_t*m=重新解释投射(arr.data());

接受的响应无法工作
.data()
以null结尾。
如果有浮点和整数,请使用左移。
例如:

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
mavlink\u姿态\u t.time\u引导\u ms=(bytearray.at(0)&0xFFFF)|

(bytearray.at(1)&0xFFFF)如果您使用它在机器之间传输数据或保存到多台机器共享的文件。然后,如果两台机器具有不同的体系结构,这种方法将无法正常工作(例如arm与x86)。请参阅QDataStream。应始终避免重新解释。它不总是做你想的。。。我建议使用结构化的数据交换方法,例如一些消息传递库,如protobuf、cap'n proto或QDataStream。它们都是平台、机器和编译器(!)不可知论者。此解决方案依赖于平台、计算机和编译器。@dom0:为什么“在任何时候”都要避免它?虽然它通常不需要,但有时非常有用。此外,并非所有应用程序都希望跨平台。我的商业项目有意将编译器、机器和平台永久地排除在外。
QDataStream
可用于序列化和使数据平台独立。在另一个平台上发送和接收后,它适用于这个新平台。所以我认为这种方法应该有效。-1:.data()以null结尾“\0”。如果bytearray.at(0)='\0'(例如,time\u boot\u ms=256),则第一个字节为'\0',其余所有字节将不确定。