如何在未知的typedef结构和QByteArray之间进行序列化和反序列化

时间:2012-10-29 12:22:40

标签: c++ qt

我是C ++和Qt的绝对初学者。

我使用Qt通过TCP广播不同的数据。发送和检索数据的过程运行正常但我在接收端解释数据时遇到了问题。

数据以不同的结构表示,这些结构的共同点是它们具有commandId和状态。其余的可能是错误消息,文件名或其他东西。这段代码不是我自己编写的,我不允许更改它(例如:定义并实现一个通用接口。)

typedef struct
{
  uint8_t commandId;
  State state;
  //special data
  QString errorMessage;
} Command1;

typedef struct
{
  uint8_t commandId;
  State state;
  //special data
  uint8_t amountSensors;
} Command2;

enum State {
  STATID_PAUSE = 50000
  STATID_RECORD = 50001
  STATID_PLAY = 50002
  STATID_ERROR = 50003
}

发件人正在以这种方式将结构转换为QByteArray

Command1 example;
example.commandId = 134;
example.state = STATID_ERROR;

char *p_Char;
p_char = reinterpret_cast<char*>(&example);
QByteArray qba(p_char, sizeof(p_char));

现在我必须写一个接收器,但接收器不知道他得到了什么(Command1Command2或其他东西)。他能够解释他是否可以读出commandId和州。

此时我能够像这样读出commandId:

commandId = static_cast<uint8_t>(qba[0]);

但我怎么能读出State的{​​{1}}?

1 个答案:

答案 0 :(得分:1)

State值的大小为int。这意味着访问它你会做:

 State state = (State) (*( reinterpret_cast<const int*>(qba.constData()+1)) );

首先,您将const char指针重新解释为const int指针,然后您将它指向它(这意味着您获取了值),并将此值转换为State

要访问其他变量,您将从索引1 + sizeof(int) = 1+ sizeof(State)

开始

thread about the size of an enum