1

我是 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]);

但是我怎么能读出Statewhich is anenum呢?

4

1 回答 1

1

State值将采用int. 这意味着要访问它,您将执行以下操作:

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

首先,您将指针重新解释const charconst int指针,然后尊重它(这意味着您获得了值),然后将此值转换为State.

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

请参阅有关 enum 大小的线程

于 2012-10-29T12:36:25.337 回答