【发布时间】:2025-12-25 03:05:11
【问题描述】:
我有一个如下所示的 DNS 数据包类(我只粘贴了其中的一部分):
class DNSPacket {
public:
struct DNSHeader {
unsigned int ID :16;
unsigned int QR :1;
unsigned int OPCODE :4;
unsigned int AA :1;
unsigned int TC :1;
unsigned int RD :1;
unsigned int RA :1;
unsigned int Z :3;
unsigned int RCODE :4;
unsigned int QDCOUNT :16;
unsigned int ANCOUNT :16;
unsigned int NSCOUNT :16;
unsigned int ARCOUNT :16;
};
private:
DNSHeader header;
std::vector<DNSQuestion> questions;
std::vector<DNSAnswer> answers;
std::vector<DNSAnswer> nameservers; // TODO: DNSAnswer?
std::vector<DNSAnswer> add_records; // TODO: DNSAnswer?
}
将char 数组反序列化为该对象的正确方法是什么?我有的选项是:重载>> 运算符,添加一个单独的类来反序列化它以读取和反序列化读取一个字节一个字节的数据并使用reinterpret_cast()。
我想在 C++11 中创建一个快速、现代的实现。我应该选择哪种方式?另外,我应该如何反序列化位域 - 我应该坚持按位运算吗?
【问题讨论】:
-
char数组的格式是什么?
-
这是一个封装了一些(问题或答案)DNS数据包的UDP数据帧。
-
你的结构不对,根据this
Z字段是三位。 -
@JoachimPileborg 感谢您指出这一点,已修复。
-
使用 96 位而不是之前的 94 位是有意义的。
标签: c++ c++11 serialization dns