gpt4 book ai didi

c++ - 如何在 C++ 中将结构映射到 char 正确的方法

转载 作者:行者123 更新时间:2023-11-28 00:08:25 25 4
gpt4 key购买 nike

在 C 中,我习惯于使用 char*,我将一些表示网络数据包的结构映射到它。然后我只分配数据包参数并通过网络发送:

已更新 - 我忘记补充说我有一些有效载荷

struct packet {
uint64_t id __attribute__((packed));
uint64_t something __attribute__((packed));
short flags __attribute__((packed));
// here follows payload with variable length
};
...
char *payload = get_payload();
size_t payload_size = get_payload_size();//doesnt matter how
char *data = malloc(sizeof(struct packet)+payload_size);
struct packet *pkt = (struct packet *)data;
pkt->id = 123;
pkt->something = get_something();
pkt->flags = FLAG | FLAG2;
memcpy(data+sizeof(struct packet), payload, payload_size);
send(data, sizeof(struct packet)+payload_size);

现在我想用一些不错的 C++ 特性来实现它(如果有更好的方法的话)我能在 C++ 中做的最好的改变是使用 new 而不是 malloc。

char *data = new char[sizeof(struct packet)];//rest is same

好的,这称为对象序列化。我发现有几个示例总是使用我不能使用的 boost。C++ 中没有本地方法来完成这个吗?

最佳答案

没有理由创建一个char* 和一个pkt*。您创建并发送一个对象,例如:

packet pkt;  // create automatic object
pkt.id = 123;
pkt.something = get_something();
pktflags = FLAG | FLAG2;
// here we cast the address of pkt to a char* so we can send it
send(reinterpret_cast<char*>(&pkt), sizeof(packet));

编辑:

由于问题已更新为将有效载荷添加到 struct 数据的末尾,您将不得不使用与在 C 中所做的相同的方法。当您 new 向上指针的语法将是

char * data = new char[sizeof(packet) + payload_size];

此外,当像在 C 中那样使用 struct 时,C++ 中不需要 struct 关键字。您只需按名称使用即可。

关于c++ - 如何在 C++ 中将结构映射到 char 正确的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34227436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com