我目前正在为学校项目开发数据包嗅探器/分析器,而且我无法从DNS标头中提取DNS标记。
DNS标头如下所示:
DNS标头结构如下所示:
struct dnshdr {
uint16_t xid;
uint16_t flags;
uint16_t qdcount;
uint16_t ancount;
uint16_t nscount;
uint16_t arcount;
};
如何从uint16_t中提取单个标志?
答案 0 :(得分:1)
你可以定义一个带有位域的结构,它总是听起来是纸上最干净的方式,但结果却是实现定义的功能的噩梦,几乎完全不可移植,或者你用掩码和移位的简单方法 - 宏是常见的实施方式:
#define QR(f) (f & 0x0001)
#define OPCODE(f) ((f & 0x001E) >> 1)
#define AA(f) ((f & 0x0020) >> 5)
...etc
这当然是假设已经进行了任何必要的字节顺序校正(因此uint16_t
的两个字节的顺序正确,以这种方式解释)
事后考虑:一位标志也不需要被移位 - 一旦它们被屏蔽,它们将变为零或非零,这足以在C中测试它们。