【问题标题】:Calculate the N IP of a network [duplicate]计算网络的N个IP [重复]
【发布时间】:2013-09-01 00:57:02
【问题描述】:

我想知道我的IP是给定网络的哪个N IP。

例如 192.168.0.3 是网络 192.168.0.0/20 的 3 IP。 256 IP 将是 192.168.1.0

有没有办法在 python 中快速计算这个?我知道 ipcalc 但没有这样的选项。

【问题讨论】:

    标签: python networking ip


    【解决方案1】:

    在标准库的ipaddress 模块中,网络对象可以用作地址的可迭代对象。所以,这只是一个序列中的正常发现:

    >>> import ipaddress
    >>> addr = ipaddress.ip_address('192.168.0.1')
    >>> net = ipaddress.ip_network('192.168.0.0/20')
    >>> net[256]
    IPv4Address('192.168.1.0')
    >>> next(i for i, a in enumerate(net) if a == addr)
    3
    

    更多解释请参见HOWTO

    请注意,这适用于整数形式的地址以及点分字符串、IPv6 和 IPv4 等。

    如果您使用的是 Python 2.x,则需要 backport on PyPI。如果您使用的是 3.0-3.2,我相信 backport 还不支持这些,在这种情况下,最好的办法是使用它所基于的库 ipaddr

    【讨论】:

    • 这也是一种可能的方式,但问题是它不是很快。试着计算一个 10/8,它会吃掉你所有的记忆
    • @DennyCrane:不会。可迭代对象上的生成器表达式不会占用任何内存。
    • 哦,是的,对不起。我看错了。我的坏
    【解决方案2】:
    reduce(lambda x,y: (int(x)*256)+int(y), IP.split('.')[2:])
    
    >>> IP = "192.168.0.3"
    >>> reduce(lambda x,y: (int(x)*256)+int(y), IP.split('.')[2:])
    3
    >>> IP = "192.168.1.0"
    >>> reduce(lambda x,y: (int(x)*256)+int(y), IP.split('.')[2:])
    256
    

    正如@Blake 指出的那样,您可以通过添加参数使其更加通用:

    def versatileCount(IP, b):
        return reduce(lambda x,y: (int(x)*256)+int(y), IP.split('.')[-b:])
    
    >>> def versatileCount(IP, b):
    ...     if not 1 <= b <= 4:
    ...         raise ValueError("b has to be between 1 and 4")
    ...     return reduce(lambda x,y: (int(x)*256)+int(y), IP.split('.')[-b:])
    ...
    >>> versatileCount(IP,2)
    256
    >>> IP = "192.168.0.3"
    >>> versatileCount(IP,2)
    3
    

    【讨论】:

    • 聪明。我唯一要更改的是在另一个 lambda 中创建 reduce(...),该 lambda 接受一个参数,该参数指定要包含多少 IP 索引 (4-1)。
    • @BlakeVandeMerwe:感谢您的想法。我已经更新了我的答案。
    • 非常感谢!正是我正在寻找的:)
    • 这仅适用于您的网络是 /24(或者,对于通用版本,是 /16 或 /8)。它不适用于例如 /20。这正是最初的问题所要求的。
    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2015-04-05
    • 2021-05-20
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多