从IP地址获取子网

Spa*_*att 5 python ip-address python-3.x

我正在尝试为我拥有的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)

ip =  '192.178.2.55'
subnet = '.'.join(ip.split('.')[:2]) + '.0.0'
subnet
'192.178.0.0'
Run Code Online (Sandbox Code Playgroud)

我看到python有ipaddress库.但是我找不到可以执行上述任务的方法.

奖励:由于ipaddress支持IPv4和IPv6,如果两者都可以使用相同的功能.

aba*_*ert 8

ipaddress.ip_network功能可以采取任何字符串格式的IPv4Network,并IPv6Network可以采取,包括address/mask格式.

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

所以:

>>> 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')
Run Code Online (Sandbox Code Playgroud)

或者,您可以ip_interface从那里使用和提取网络:

>>> 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')
Run Code Online (Sandbox Code Playgroud)

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

当然,它们都可以与IPv6一起工作:

>>> 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::')
Run Code Online (Sandbox Code Playgroud)


DYZ*_*DYZ 5

subnet只是一个二进制掩码,必须and与 IP 地址按位进行处理。您可以自己敷面膜:

".".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'
Run Code Online (Sandbox Code Playgroud)

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