在Python中获取IP地址和子网掩码长度,获得IP掩码。

7
给定一个点分十进制表示的IP地址,例如:192.192.45.1以及掩码长度,例如8、16、24等,但也可以是任何值,例如17。
请问有人能够提供用Python计算子网掩码的代码吗?最好能够得到32位整数结果,这样很容易进行哈希操作并在需要时重新解释为点分十进制形式进行打印。我发现Python有一个套接字库,基本上是Unix套接字API的包装器。我还看到它有一个名为inet_ntoa()的函数,但它返回某种数据包结构。我对Python的struct库不是特别熟悉,所以希望其他人能提供一些想法。谢谢!
2个回答

17
最简单的方法是使用谷歌的ipaddr模块。我假设下面使用25位掩码,但正如你所说,它可以是任何值。
对于Python2
>>> # Use ipaddr in python 2.x
>>> import ipaddr
>>> mask = ipaddr.IPv4Network('192.192.45.1/25')
>>> mask.netmask
IPv4Address('255.255.255.128')
>>>

对于Python 3...

>>> # Use ipaddress in python 3.x
>>> import ipaddress
>>> mask = ipaddress.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>

1
@themaestro,我很高兴它有所帮助。请查看ipaddr的维基 - Mike Pennington
1
在Python 3.x中,可以使用内置版本的此模块来完成相同的操作,现在称为“ipaddress”(即import ipaddress ...)。 - JJC

8
您可以这样计算掩码的32位值
(1<<32) - (1<<32>>mask_length)

eg.

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接