计算子网地址:
命令: 如果将主机地址和网络掩码分别表示为4个数字的列表,则可以取一个列表中第一个数字与另一个列表中的第一个数字的按位与,然后取一个列表中第二个数字的按位与。以及另一个列表中第二个数字的按位与,依此类推。以列表形式返回网络地址。
我的代码:
def apply_network_mask(host_address, netmask):
ips = host_address.split(".")
net = netmask.split(".")
ips_bin = [format(int(i), '08b') for i in ips]
net_bin = [format(int(i), '08b') for i in net]
print(f"{ips_bin & net_bin}")
我的代码:
我需要什么: apply_network_mask([192,168,0,191],[255,255,255,0])我应该找回[192,168,0,0]
答案 0 :(得分:0)
看这个例子
from ipaddress import IPv4Address
import re
class MyIPv4(IPv4Address):
def __and__(self, other: IPv4Address):
if not isinstance(other, (int, IPv4Address)):
raise NotImplementedError
return self.__class__(int(self) & int(other))
@property
def binary_repr(self, sep=".") -> str:
"""Represent IPv4 in binary"""
return sep.join(f"{i:08b}" for i in self.packed)
@classmethod
def from_binary_repr(cls, binary_repr: str):
"""Represent IPv4 ifrom binary to human readable view"""
i = int(re.sub(r"[^01]", "", binary_repr), 2)
return cls(i)
addr = MyIPv4("192.168.0.2")
mask = MyIPv4("255.255.255.0")
print(f'{addr} & {mask} is {addr & mask} network')
print(f'{addr.binary_repr} & {mask.binary_repr} is {(addr & mask).binary_repr} network')
答案 1 :(得分:0)
您可以通过阅读ipaddress.ip_interface
的network
属性来一次性完成操作
>>> import ipaddress
>>> ipaddress.ip_interface("192.168.0.161/255.255.255.0").network
IPv4Network('192.168.0.0/24')
您可以走得更远,直接从IPv4Network
的{{1}}属性中以字符串的形式获取您的网络地址
with_netmask
这也适用于IPv6地址
>>> ipaddress.ip_interface("192.168.0.161/255.255.255.0").network.with_netmask.split('/')
['192.168.0.0', '255.255.255.0']