计算子网地址

时间:2020-08-13 11:16:58

标签: python

计算子网地址:

命令: 如果将主机地址和网络掩码分别表示为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}")

我的代码: My Code

我需要什么: apply_network_mask([192,168,0,191],[255,255,255,0])我应该找回[192,168,0,0]

2 个答案:

答案 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')

source

答案 1 :(得分:0)

您可以通过阅读ipaddress.ip_interfacenetwork属性来一次性完成操作

>>> 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']