我目前正在为一个学校项目开发数据包嗅探器/分析器,但在从 DNS header 中提取 DNS 标志时遇到问题。
DNS header 如下所示:
DNS header 结构如下所示:
struct dnshdr {
uint16_t xid;
uint16_t flags;
uint16_t qdcount;
uint16_t ancount;
uint16_t nscount;
uint16_t arcount;
};
如何从 uint16_t 中提取各个标志?
最佳答案
您可以使用位域定义一个结构,这在纸面上听起来总是最干净的方式,但事实证明这是实现定义的功能的噩梦,并且几乎完全不可移植,或者您可以使用掩码和移位 - 宏来简单地实现它常见的实现是:
#define QR(f) (f & 0x0001)
#define OPCODE(f) ((f & 0x001E) >> 1)
#define AA(f) ((f & 0x0020) >> 5)
...etc
这当然是假设已经完成了任何必要的字节顺序校正(因此 uint16_t
的两个字节以正确的顺序以这种方式解释)
事后思考:一位标志实际上也不需要移动 - 一旦它们被屏蔽,它们将为零或非零,这足以在 C 中测试它们。
关于c - 从 uint16_t 读取标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20934640/