c - 迷你拼图 IP header

标签 c ip c-preprocessor

看下面的代码:

#define IP_HL(ip)       (((ip)->ip_vhl) & 0x0f)
#define IP_V(ip)        (((ip)->ip_vhl) >> 4)

完整代码在这里http://www.tcpdump.org/pcap.html

据我了解,ip_vhl 中的 8 位为:

  • IP_HL 对 0000 1111 进行 & 运算,这意味着我们得到了最后四位
  • IP_V 将位模式向右移动四位,这也给了我们最后四位...

我检查了代码,它工作正常:它显示 IP 版本为 4, header 大小为 5...

它如何返回不同的数字? 我的理解有什么问题吗?

最佳答案

不,IP_V 将位模式向右移动四位,这给了我们四位(假设,正如您所做的那样,它是一个 8 位值)。

更详细地,假设位模式abcdefgh:

  abcd efgh         abcd efgh
& 0000 1111              >> 4
  =========         =========
  0000 efgh         0000 abcd

>> 4 运算会丢弃右侧退出的位,并在左侧输入 0 位。因此,一次将该值右移一点将给出:

abcd efgh     --> direction of shift
0abc defg
00ab cdef
000a bcde
0000 abcd

关于c - 迷你拼图 IP header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20231394/

相关文章:

c++ - 如何使用带有标题和 .so 文件的库?

用于打印每个底指数的 C 函数 例如,integerPower( 3, 4 ) = 3 * 3 * 3 * 3

c++ - 如何在一行中检查没有定义任何预处理器宏?

ios - 如何更改#define值

c - 需要一种算法来对 n 维超球体进行像素化

比较文本文件中的字符串的一行,并在找到时删除该行

java - 如何在java中动态获取服务器地址ip

android - Android 设备是否有静态 IP 地址?

vb.net - 用 VB.NET 获取 "real"IP 地址?

c++ - 如何附加到 C++ 预处理器宏?