Python 处理子网掩码

2018-03-29 13:31:59 +08:00
 suannva

输入 172.14.0.0/24,返回数组从 172.14.1.1-172.14.254.254

怎么实现这种效果?

2312 次点击
所在节点    Python
12 条回复
holmesabc
2018-03-29 13:36:30 +08:00
转二进制,and
DevNet
2018-03-29 13:38:17 +08:00
IPy 这个模块专门处理 IP 的,你看看,应该能满足你的需求
suannva
2018-03-29 13:38:48 +08:00
@DevNet 好的谢谢,我去看看。
DevNet
2018-03-29 13:41:12 +08:00
才发现,楼主掩码写的不对
172.14.0.0/24 = 172.14.0.1~172.14.0.255
172.14.0.0/16 = 172.14.0.1~172.14.255.255
Greenm
2018-03-29 13:47:03 +08:00
netaddr 了解一下
wonter
2018-03-29 13:48:18 +08:00
如果是 Python3 的话,官方的 ipaddress 库了解

```python3
import ipaddress
first, *_, last = ipaddress.IPv4Network('172.14.0.0/24').hosts()
print('{} - {}'.format(first, last))
```
suannva
2018-03-29 13:52:20 +08:00
额 刚刚在吃饭 打错了 不好意思
suannva
2018-03-29 13:53:17 +08:00
@DevNet 刚刚在吃饭,写错了 不好意思。
exiaohao
2018-03-29 13:54:22 +08:00
首先,172.14.0.0/24 应该是 172.14.0.0-172.14.0.255
然后用 ipaddress 就可以搞定了啊

```python
def every_addr(ip_range):
import ipaddress
ipn = ipaddress.IPv4Network(ip_range)
return [ipn.network_address + i for i in range(0, 2 ** (32 - ipn._prefixlen))]
```
ScotGu
2018-03-29 13:54:57 +08:00
@DevNet #4
>才发现,楼主掩码写的不对
>172.14.0.0/24 = 172.14.0.1~172.14.0.255
>172.14.0.0/16 = 172.14.0.1~172.14.255.255

LZ 的要求应该是可用 IP 吧。
一个网段最后的 .255 是广播位,不可用。
exiaohao
2018-03-29 13:59:00 +08:00
@wonter 没好好看过文档的不知道有 hosts 这玩意真惭愧...

@ScotGu 如果不要广播地址和网络号,取 broadcast_address 和 network_address 按需跳过就好啦
fanhaipeng0403
2018-03-29 18:14:43 +08:00
ipaddress 库?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/442453

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX