【问题标题】:Get IP Mask from IP Address and Mask Length in Python在 Python 中从 IP 地址和掩码长度获取 IP 掩码
【发布时间】:2012-05-17 12:34:24
【问题描述】:

给定一个以点分四符号表示的 IP 地址,例如:
192.192.45.1
掩码长度通常为 8、16、24,但也可以是任何值,例如 17。

有人可以提供python中的代码来计算子网掩码吗?最好是我 可以将结果作为 32 位整数得到,因此很容易散列,然后在需要打印时重新解释为点分四边形。我看到python有一个socket库,它基本上是unix socket api的包装器。我还看到它有函数inet_ntoa(), 但它返回某种数据包结构。我对 Python 结构库不是很熟悉,所以我希望其他人会有一些想法。谢谢!

【问题讨论】:

    标签: python sockets networking ip-address subnet


    【解决方案1】:

    最简单的方法是使用google的ipaddr模块。我假设下面有一个 25 位掩码,但正如你所说,它可以是任何东西

    >>> import ipaddr
    >>> mask = ipaddr.IPv4Network('192.192.45.1/25')
    >>> mask.netmask
    IPv4Address('255.255.255.128')
    >>>
    

    该模块在处理 IPv4 和 IPv6 地址方面相当有效...其中一些其他功能的示例...

    >>> ## Subnet number?
    >>> mask.network
    IPv4Address('192.192.45.0')
    >>>
    >>> ## RFC 1918 space?
    >>> mask.is_private
    False
    >>>
    >>  ## The subnet broadcast address
    >>> mask.broadcast
    IPv4Address('192.192.45.127')
    >>> mask.iterhosts()
    <generator object iterhosts at 0xb72b3f2c>
    

    【讨论】:

    • @themaestro,我很高兴它有帮助。查看ipaddr's wiki
    • 在 python 3.x 中,同样可以使用这个模块的内置版本来完成,现在称为“ipaddress”(即 import ipaddress ...)。
    【解决方案2】:

    你可以这样计算掩码的 32 位值

    (1<<32) - (1<<32>>mask_length)
    

    例如。

    >>> import socket, struct
    >>> mask_length = 24
    >>> mask = (1<<32) - (1<<32>>mask_length)
    >>> socket.inet_ntoa(struct.pack(">L", mask))
    '255.255.255.0'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-31
      • 2011-07-28
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 2015-07-02
      相关资源
      最近更新 更多