在 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 掩码的主要内容,如果未能解决你的问题,请参考以下文章