将对象转换为char然后“uncasting back”

时间:2012-10-10 04:31:00

标签: c++ casting char

如果你有一个对象

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

无论如何,我可以“uncast”回来获取原始数据包P?

3 个答案:

答案 0 :(得分:3)

简单的方法是使用reinterpret_cast<Packet>(*(reinterpret_cast<Packet*>(pUC))),其中pUCunsigned 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;
};

答案 1 :(得分:0)

unsigned char *p = (unsigned char*) &P;
Packet *pPacket = (Packet *)p;

答案 2 :(得分:0)

是的,理论上你可以这样做。
由于Packet*unsigned char*都是指向数据类型的指针,因此不会发生信息丢失(如果其中一个是函数指针,那么信息可能会丢失)。

很少有事情需要注意:

  • 首先避免这种类型转换
  • 最好从void*进行类型转换以获得通用性;在转换为void*时,您不必使用类型转换
  • 使用reinterpret_cast<>向读者显示“脏”的内容 发生