我必须做一个嗅探器作为安全课程的任务。我正在使用C和pcap库。我把一切都运行得很好(因为我从互联网上获得了代码并改变了它)。但我对代码有一些疑问。
u_int ip_len = (ih->ver_ihl & 0xf) * 4;
ih
的类型为ip_header
,其当前指向数据包中的IP标头。
ver_ihl
给出了IP的版本
我无法弄清楚是什么:& 0xf) * 4;
答案 0 :(得分:3)
&安培;是按位和运算符,在这种情况下,你正在使用0xf和ver_ihl,它具有清除除了最不重要的4之外的所有位的效果
0xff& 0x0f = 0x0f
ver_ihl定义为前4位=版本+秒4 =互联网标题长度。和操作删除版本数据,留下长度数据本身。长度记录为32位字的计数,因此* 4将ip_len转换为标题中的字节数
回应你的评论:
按位并且和操作数中的相应位。当你和任何一个0都变为0而且任何一个都保持不变。
0xf = 0x0f =二进制0000 1111
所以,当你和0x0f有任何东西时,前4位被设置为0(因为你正在将它们与0对齐),而最后4位仍然与另一个操作数一样(因为你将它们与1对比)。这是一种称为位掩码的常用技术。
答案 1 :(得分:1)
从定义IPv4的RFC 791读取:
互联网标题内容摘要如下:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
IP头的前8位是版本和IHL字段的组合。
国际人道法:4位
Internet标头长度是32中互联网标头的长度 位字,因此指向数据的开头。注意 正确标题的最小值为5.
你所拥有的代码是在那里取前8位,然后切断IHL部分,然后将其转换为字节数。按位AND by 0xF
将隔离IHL字段,乘以4则是因为32位字中有4个字节。
答案 2 :(得分:0)
ver_ihl字段包含两个4位整数,打包为低和高的nybble。长度指定为32位字的数量。因此,如果你有一个版本4的IP帧,有20个字节的标题,你的ver_ihl字段值为69.那么你就有了这个:
01000101
& 00001111
--------
00000101
所以,是的,“& 0xf”屏蔽了低4位。