python unpack_关于python中的struct.unpack()

感谢J.F.塞巴斯蒂安的提示。我终于弄明白了,要花点时间在这里解释。通常,我们必须在每个报头的结构中查找C类型,以了解在数据包的不同报头中的每个字段使用的C类型。然后,我们可以使用这个table来知道哪个格式说明符将表示哪个C类型。例如,在IP头的情况下,结构如下所示:struct ipheader {

unsigned char ip_hl:4, ip_v:4; /* this means that each member is 4 bits */

unsigned char ip_tos;

unsigned short int ip_len;

unsigned short int ip_id;

unsigned short int ip_off;

unsigned char ip_ttl;

unsigned char ip_p;

unsigned short int ip_sum;

unsigned int ip_src;

unsigned int ip_dst;

};

对于eg:unsigned char表示为“B”,unsigned int表示为“I”。现在我们可以使用这个方法来了解struct.unpack()中应该使用什么格式说明符来获取IP头的字段值。在IP报头的情况下,它变成如下:struct.unpack('!BBHHHBBHII')

但是你应该注意到大部分程序使用

struct.unpack('!BBHHHBBH4s4s')。

所以问题就来了,为什么在unsigned int ip_src;&unsigned int ip_dst;的情况下,使用's'而不是'I'作为struct.unpack()中的格式说明符。原因是如果“I”用作格式说明符,那么unpack()方法将以整数形式返回IP地址(例如:3232267778)。然后必须将其转换为实际的IP地址形式(例如:10.0.0.1)。通常在internet上可用的嗅探器程序中,只需使用socket.inet_ntoa()获取实际ip地址。此方法接受字符串类型而不是整数类型。因此,这就是为什么在unsigned int的情况下,在struct.unpack()中使用's'而不是'I'作为格式说明符,以便稍后将结果馈送到socket.inet_ntoa(),以获得实际ip地址格式的ip地址。以太报头的情况类似。在struct.unpack()中,我们使用's'而不是'B',因为我们需要一个字符串,该字符串可以稍后馈送到binascii.hexlify(),以便以实际的MAC地址格式获取MAC。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值