2012-10-10 48 views
0

如果你有一个对象铸造对象为char,然后 “uncasting回”

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

回答

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

他希望剧组回'Packet',不'包*' 。 –

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; 
}; 
+0

谢谢!,如何使用转换运算符和转换构造函数?我在C++中是一个新手。一个例子将非常感激 – Algorithmatic

0

是的,理论上你可以做到这一点。
由于两个Packet*unsigned char*是指针数据类型,没有信息丢失发生(如果他们中的一个是一个函数指针,然后它可能是信息可能会丢失)。

几点需要注意:

  • 避免这样的类型转换在首位
  • 这是更好地强制转换为/从void*成为一般性;而在铸造void*你没有使用强制类型转换
  • 使用reinterpret_cast<>向读者展示的东西“脏”是 发生