在 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/