有没有办法找出对象的类型(以字节数组形式)C++?

Posted

技术标签:

【中文标题】有没有办法找出对象的类型(以字节数组形式)C++?【英文标题】:Is there a way to figure out the type of object (in array of bytes form) C++? 【发布时间】:2020-06-09 09:06:18 【问题描述】:

我一直在将 boost::asio 用于客户端服务器应用程序,我将打包的结构体作为消息来回发送,服务器需要识别传递给它的请求结构体的类型并相应地确定它的响应。现在每个结构都有一个唯一的TemplateId,它存储在第二级结构中:MessageHeader,有没有办法从接收到的字节数组(char *)中知道结构的类型。

示例结构:

typedef struct  
    MessageHeaderInComp MessageHeaderIn;
    RequestHeaderComp RequestHeader;
    uint32_t Username;
    char Pad4[LEN_PAD4];
 __attribute__((packed)) UserLogoutRequest;



typedef struct  
    uint32_t BodyLen;
    uint16_t TemplateID;  //this is unique
    char NetworkMsgID[LEN_NETWORKMSGID];
    char Pad2[LEN_PAD2];
 __attribute__((packed)) MessageHeaderInComp; 

目前我正在使用:

const UserLogoutRequest*obj = reinterpret_cast<const UserLogoutRequest*>(buf);  //buff is a character array
int tempId = obj->MessageHeaderIn.TemplateID;

但是这是针对特定类型(UserLogoutRequest)的硬编码,我想替换它,我该怎么办?欢迎任何想法或建议。

【问题讨论】:

你的意思是在重新解释部分?我试过了,但在解码时由于某种原因它不起作用 你能比doesn't work更具体吗?请提供minimal reproducible example 【参考方案1】:

如果所有响应具有相同的初始结构,您的方法将起作用

typedef struct 
   uint32_t BodyLen;
   uint16_t TemplateID;  //this is unique

如果所有的请求都以此为开头,它将起作用。不管是什么真实的类型。您可以将任何char * 指针转换为MessageHeaderInComp 类型并验证TemplateID

事实上,许多库中都使用了该方法,并且根据类型 id,它可以稍后根据 id 转换为正确的结构。

【讨论】:

值得一提的琐碎类型和标准布局

以上是关于有没有办法找出对象的类型(以字节数组形式)C++?的主要内容,如果未能解决你的问题,请参考以下文章

C++对象数组与对象指针

将字节数组从 c++ 传递到 c#(单声道)

如何将字节数组的字符串转换为字节数组

将 C# 3D 数组作为 1D 字节数组传递给 C++ 库

有没有办法在 Asp.Net Core Identity 中将 PasswordHash 的数据类型从字符串更改为字节数组

将字节数组从 c++ 传递给 python