分解IP头

sca*_*man 5 c ip network-programming pcap

我必须做一个嗅探器作为安全课程的任务.我正在使用C和pcap库.我把一切都运行得很好(因为我从互联网上获得了代码并改变了它).但我对代码有一些疑问.

u_int ip_len = (ih->ver_ihl & 0xf) * 4;   
Run Code Online (Sandbox Code Playgroud)

ih是类型ip_header,并且它当前指向数据包中的IP标头.
ver_ihl给出了IP的版本.
我无法弄清楚是什么:& 0xf) * 4;

Pat*_*ick 3

& 是按位与运算符,在本例中,您将 ver_ihl 与 0xf 进行与运算,其效果是清除除最低有效位 4 之外的所有位

0xff & 0x0f = 0x0f

ver_ihl 定义为前 4 位 = 版本 + 第二个 4 = 互联网标头长度。and 运算删除版本数据,仅留下长度数据。长度记录为 32 位字的计数,因此 *4 将 ip_len 转换为标头中的字节数

回复您的评论:

按位与操作数中的相应位。当你和任何带有 0 的东西时,它都会变成 0,而任何带有 1 的东西都保持不变。

0xf = 0x0f = 二进制 0000 1111

因此,当您将 0x0f 与任何内容一起使用时,前 4 位将设置为 0(因为您将它们与 0 进行与运算),而最后 4 位则保持与另一个操作数相同(就像您将它们与 1 进行与运算一样)。这是一种称为位掩码的常见技术。

http://en.wikipedia.org/wiki/Bitwise_operation#AND