在 Python 中从 IP 地址和掩码长度获取 IP 掩码

Posted

技术标签:

【中文标题】在 Python 中从 IP 地址和掩码长度获取 IP 掩码【英文标题】:Get IP Mask from IP Address and Mask Length in Python 【发布时间】: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 结构库不是很熟悉,所以我希望其他人会有一些想法。谢谢!

【问题讨论】:

【参考方案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'

【讨论】:

以上是关于在 Python 中从 IP 地址和掩码长度获取 IP 掩码的主要内容,如果未能解决你的问题,请参考以下文章

如何用python脚本获取ip,掩码,地址,网段

识别有效的IP地址和掩码并进行分类统计

在 Java 代码中获取错误以查找有关子网和掩码的信息 [重复]

牛客 HJ18 识别有效的IP地址和掩码并进行分类统计

华为机试HJ18:识别有效的IP地址和掩码并进行分类统计

Python 输入IP地址及掩码告诉你该网段包含的全部地址(IPy模块练习)