0

オブジェがあれば

struct Packet P;

からなる

struct Packet {
    struct Packet_header header;
    unsigned char data[MAXIMUM_BUFFER_LENGTH];
};

ヘッダーは

struct Packet_header {
    unsigned int checksum;
    unsigned int seq;
    unsigned int ack;
    unsigned int data_length;
};

パケットをキャストしようとすると

(unsigned char*) &P

元のパケット P を取得するために「アンキャスト」できる方法はありますか?

4

3 に答える 3

3

簡単な方法は、 を使用するreinterpret_cast<Packet>(*(reinterpret_cast<Packet*>(pUC)))ことpUCですunsigned char*

正しい方法は、Packet_header変換コンストラクターとキャスト演算子 (またはキャストのようなメソッド) を使用することです。

struct Packet_header {
    Packet_header(unsigned char*);  //construct object form unsigned char*
    operator unsigned char*();      //cast it back
    const unsigned char* getUC();   //or get an unsigned char*

    unsigned int checksum;
    unsigned int seq;
    unsigned int ack;
    unsigned int data_length;
};
于 2012-10-10T04:35:09.793 に答える
0

はい、理論的にはそれができます。とは
両方ともデータ型へのポインタであるため、情報の損失は発生しません(一方が関数ポインタの場合、情報が失われる可能性があります)。Packet*unsigned char*

注意すべき点はほとんどありません。

  • そもそもそのような型キャストは避けてください
  • 一般性を高めるために、型キャストを行ったり来void*たりすることをお勧めします。キャスト中にvoid*型キャストを使用する必要はありません
  • reinterpret_cast<>何か「汚い」が起こっていることを読者に示すために使用する
于 2012-10-10T04:35:19.437 に答える
0
unsigned char *p = (unsigned char*) &P;
Packet *pPacket = (Packet *)p;
于 2012-10-10T04:34:41.010 に答える