从uint16_t读取标志

时间:2014-01-05 14:21:19

标签: c header dns bit-manipulation operation

我目前正在为学校项目开发数据包嗅探器/分析器,而且我无法从DNS标头中提取DNS标记。

DNS标头如下所示: enter image description here

DNS标头结构如下所示:

struct dnshdr {
        uint16_t xid;
        uint16_t flags;
        uint16_t qdcount;
        uint16_t ancount;
        uint16_t nscount;                                          
        uint16_t arcount;
};

如何从uint16_t中提取单个标志?

1 个答案:

答案 0 :(得分:1)

你可以定义一个带有位域的结构,它总是听起来是纸上最干净的方式,但结果却是实现定义的功能的噩梦,几乎完全不可移植,或者你用掩码和移位的简单方法 - 宏是常见的实施方式:

#define QR(f)      (f & 0x0001)
#define OPCODE(f)  ((f & 0x001E) >> 1)
#define AA(f)      ((f & 0x0020) >> 5)
...etc

这当然是假设已经进行了任何必要的字节顺序校正(因此uint16_t的两个字节的顺序正确,以这种方式解释)

事后考虑:一位标志也不需要被移位 - 一旦它们被屏蔽,它们将变为零或非零,这足以在C中测试它们。