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))),。pUCunsigned char*

正确的方法是在 in 中拥有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
unsigned char *p = (unsigned char*) &P;
Packet *pPacket = (Packet *)p;
于 2012-10-10T04:34:41.010 回答
0

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

有几点需要注意:

  • 首先避免这种类型转换
  • 为了通用性,最好进行类型转换void*;在向您投射时void*不必使用类型转换
  • 用于reinterpret_cast<>向读者表明正在发生“肮脏”的事情
于 2012-10-10T04:35:19.437 回答