2014-10-28 3 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()은 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 

리틀 엔디안을 사용하는 경우

는 indexs을 반전.