c - 从 uint16_t 读取标志

标签 c header dns bit-manipulation operation

我目前正在为一个学校项目开发数据包嗅探器/分析器,但在从 DNS header 中提取 DNS 标志时遇到问题。

DNS header 如下所示: enter image description here

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/

相关文章:

javascript - Angular JS TypeScript IHttpService 注入(inject)自定义 header 值

HTTP:通用用户代理指南: header ?

c++ - 将 32 位 float 映射到 32 位整数

c - 将数组中的十六进制转换为ascii,以便在C语言中进行比较

c++ - 在 C++ 中使用头文件时如何以及在何处定义类变量

wordpress - 将 WordPress URL 批量转换为新 URL 结构的最佳方法?

c++ - 如何在 C/C++ 中构建自定义的简单 DNS 服务器

JavaScript 功能在网络上损坏,但在文件中可用

c - 为什么我的 while 循环条件不起作用?

c - 如何在 stdio.h(CLANG,OS X)中实现自定义版本的 getline 函数(答案 : Change POSIX standard used to compile)