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

しかし、どうすればこれを読み取ることができStateますenumか?

4

1 に答える 1

1

State値はのサイズになりますint。これは、それにアクセスすることを意味します:

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

最初にconst charポインターをポインターとして再解釈しconst int、次にそれを尊重し(つまり、値を取得します)、この値を。としてキャストしますState

他の変数にアクセスするには、インデックスから始めます1 + sizeof(int) = 1+ sizeof(State)

列挙型のサイズについては、このスレッドを参照してください。

于 2012-10-29T12:36:25.337 に答える