【问题标题】:casting an object to char and then "uncasting it back"将对象转换为 char 然后“将其取消转换”
【发布时间】:2024-01-19 12:39:01
【问题描述】:

如果你有一个对象

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?

【问题讨论】:

    标签: c++ casting char


    【解决方案1】:

    简单的方法是使用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;
    };
    

    【讨论】:

    • 谢谢!如何使用强制转换运算符和转换构造函数?我是 C++ 的新手。一个例子将不胜感激
    【解决方案2】:
    unsigned char *p = (unsigned char*) &P;
    Packet *pPacket = (Packet *)p;
    

    【讨论】:

    • 他希望演员回到Packet,而不是Packet*
    【解决方案3】:

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

    注意事项:

    • 首先避免这种类型转换
    • 为了通用性,最好在void* 之间进行类型转换;在转换为 void* 时,您不必使用类型转换
    • 使用reinterpret_cast<> 向读者展示一些“肮脏”的东西 正在发生

    【讨论】: