2014-10-28 9 views
2

Мне нужно преобразовать QByteArray в структуру. У меня есть структура вроде этого:Qt-как преобразовать 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 приходит из последовательного порта. Я уже использовал союз, но я думаю, что он не может использоваться для QByteArray. Есть ли другой способ? пример действительно может помочь! танки.

+2

если вы используете это для передачи данных между машинами или сохранения в файл, разделяемый несколькими машинами. Тогда, если обе машины имеют разную архитектуру, этот подход не будет работать должным образом (например, arm vs x86). См. QDataStream. –

ответ

2

Вы можете брось:

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

reinterpret_cast следует избегать в любое время. Это не всегда делает то, что вы думаете ... Я предлагаю использовать структурированные способы обмена данными, например. некоторые библиотеки обмена сообщениями, такие как protobuf, cap'n proto или QDataStream. Все они являются платформой, машиной и компилятором (!) Агностиком. Это решение зависит от платформы, машины и компилятора. – dom0

+2

@ dom0: почему его следует избегать «во все времена»? Хотя, как правило, это не нужно, иногда это очень полезно. Кроме того, не каждое приложение хочет быть кросс-платформенным. Мой коммерческий проект преднамеренно компилятор, машина и платформа агностик навсегда. – lpapp

+0

'QDataStream' может использоваться для сериализации и создания независимой от платформы данных. После отправки и получения ее на другой платформе она подходит для этой новой платформы. Поэтому я считаю, что этот подход должен работать. –

0

Принятая ответ не может работать. .data() завершено в ноль.
У вас есть float и ints, используйте shift left.
Пример:

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, инвертировать индексирует.

Смежные вопросы