【问题标题】:Constructing struct from char* payload in C在 C 中从 char* 有效负载构造结构
【发布时间】:2020-06-30 10:48:48
【问题描述】:

我可以从 char* 负载中填充结构的所有字段吗?

例如,如果我的结构是:

    struct  ether_header {
        u_char  ether_dhost[6];
        u_char  ether_shost[6];
        u_short ether_type;
    };

如何构建我的

char payload[MAXLEN];

所以

// equivalent to assigning "abcde" to eth_hdr->shost, eth_hdr->dhost
// and any dummy numeric value to eth_hdr->ether_type*
struct ether_header *eth_hdr = (struct ether_header *) payload;

【问题讨论】:

    标签: c memory struct char ethernet


    【解决方案1】:

    指针双关语不是什么好东西。有更安全的方法。

    memcpy(&ourstruct, payload, sizeof(ourstruct));
    

    union 
    {
         struct  ether_header str;
         char payload[MAXLEN];
    }myunion;
    

    如果位置不匹配,则仅复制字段

    memcpy(ourstruct.ether_dhost[0], &payload[ether_dhost_POS], sizeof(ourstruct.ether_dhost));
    

    【讨论】:

    • 请记住,您必须使用特定于编译器的非标准命令禁用填充才能使其正常工作。
    • @Lundin 两者的内存布局必须匹配是合乎逻辑的。如果不是,则应使用第三种方法
    • 初学者通常不知道对齐和填充,忽略它是一个常见的错误。这反过来意味着如果没有手动序列化/反序列化,这样的代码就不能 100% 移植,因为 #pragma pack 等不是标准的。
    • 其实我的问题是,如何构造payload来给一个char*(即payload)添加一个u_short,然后正确理解char*来填充所有字段结构?
    • @TeodoraArgintaru memcpy(payload, &ourstruct, sizeof(ourstruct));
    猜你喜欢
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2021-09-13
    相关资源
    最近更新 更多