如果你有一个对象
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 :(得分: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;
};
答案 1 :(得分:0)
unsigned char *p = (unsigned char*) &P;
Packet *pPacket = (Packet *)p;
答案 2 :(得分:0)
是的,理论上你可以这样做。
由于Packet*
和unsigned char*
都是指向数据类型的指针,因此不会发生信息丢失(如果其中一个是函数指针,那么信息可能会丢失)。
很少有事情需要注意:
void*
进行类型转换以获得通用性;在转换为void*
时,您不必使用类型转换reinterpret_cast<>
向读者显示“脏”的内容
发生