首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从IP地址获取子网

从IP地址获取子网
EN

Stack Overflow用户
提问于 2018-06-15 07:54:48
回答 2查看 19.5K关注 0票数 9

我正在尝试获取我拥有的IP地址的子网。

例如:

1

子网掩码:255.255.255.0

输入:192.178.2.55

输出:192.178.2.0

2

子网掩码:255.255.0.0

输入:192.178.2.55

输出:192.178.0.0

目前,我这样做(对于子网255.255.255.0)

代码语言:javascript
复制
ip =  '192.178.2.55'
subnet = '.'.join(ip.split('.')[:2]) + '.0.0'
subnet
'192.178.0.0'

我看到python有的ipaddress库。但是,我找不到可以完成上述任务的方法。

额外的好处:由于ipaddress支持IPv4和IPv6,如果两个都可以使用相同的函数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-15 08:04:05

ipaddress.ip_network函数可以采用IPv4NetworkIPv6Network可以采用的任何字符串格式,包括address/mask格式。

由于您实际上传递的不是网络地址,而是该网络中设置了主机位的地址,因此需要使用strict=False

所以:

代码语言:javascript
复制
>>> net = ipaddress.ip_network('192.178.2.55/255.255.255.0', strict=False)
>>> net
IPv4Network('192.178.2.0/24')
>>> net.network_address
IPv4Address('192.178.2.0')
>>> net.netmask
IPv4Address('255.255.255.0')

或者,您可以使用ip_interface并从中提取网络:

代码语言:javascript
复制
>>> iface = ipaddress.ip_interface('192.178.2.55/255.255.255.0')
>>> iface
IPv4Interface('192.178.2.55/24')
>>> iface.network
IPv4Network('192.178.2.0/24')
>>> iface.netmask
IPv4Address('255.255.255.0')
>>> iface.ip
IPv4Address('192.178.2.55')
>>> iface.network.network_address
IPv4Address('192.178.2.0')

你想要这两个中的哪一个取决于你到底想代表什么。请注意,接口类型是Address类型的子类,当然它们会记住用于构造它们的原始地址,而Network类则会记住网络地址;这两个类中的一个通常是决定因素。

当然,这两种方法在IPv6上都能很好地工作:

代码语言:javascript
复制
>>> ipaddress.ip_interface('2001:db8::1000/32')
IPv6Interface('2001:db8::1000/32')
>>> ipaddress.ip_interface('2001:db8::1000/32').network.network_address
IPv6Address('2001:db8::')
票数 15
EN

Stack Overflow用户

发布于 2018-06-15 08:02:42

subnet只是一个简单的二进制掩码,它必须与IP地址逐位and。你可以自己应用掩码:

代码语言:javascript
复制
".".join(map(str, [i & m # Apply the mask
          for i,m in zip(map(int, ip.split(".")),
                         map(int, subnet.split(".")))]))
#'192.178.2.0'

此解决方案仅适用于IPv4地址。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50867435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档