5

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

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

4

2 回答 2

14

最简单的方法是使用 google 的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>
于 2012-05-09T01:04:21.293 回答
7

您可以像这样计算掩码的 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'
于 2012-05-09T01:29:53.130 回答