看下面的代码:
#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/