在python中将cidr转换为子网掩码
Posted
技术标签:
【中文标题】在python中将cidr转换为子网掩码【英文标题】:convert cidr to subnet mask in python 【发布时间】:2016-02-18 10:16:36 【问题描述】:我有一个我创建的 python 字典,该字典包含以下格式的子网列表:
x.x.x.x/24
y.y.y,y/25
z.z.z.z/26
a.a.a.a/27
等等……
我想把这本字典里的项目,解析一下,然后按以下格式吐出结果:
x.x.x.x 255.255.255.0
y.y.y.y 255.255.255.128
x.x.x.x 255.255.255.192
a.a.a.a 255.255.255.224
到目前为止,我对此并没有太多了解,因为我在网络上找不到很多关于此主题的内容,也没有任何可以快速简洁的方式。想法?
【问题讨论】:
你的数据不是你提到的字典! 如果看一个例子有帮助,我创建了一个类here。 【参考方案1】:代码:
import socket
import struct
def cidr_to_netmask(cidr):
network, net_bits = cidr.split('/')
host_bits = 32 - int(net_bits)
netmask = socket.inet_ntoa(struct.pack('!I', (1 << 32) - (1 << host_bits)))
return network, netmask
用法:
>>> cidr_to_netmask('10.10.1.32/27')
('10.10.1.32', '255.255.255.224')
>>> cidr_to_netmask('208.128.0.0/11')
('208.128.0.0', '255.224.0.0')
>>> cidr_to_netmask('208.130.28.0/22')
('208.130.28.0', '255.255.252.0')
【讨论】:
不言而喻,但对于 IPv6 发起。 CIDR 是 IPv6 的官方表示法,网络掩码不再是一个东西。但如果你仍然想这样做,你可以这样做:gist.github.com/Torxed/148303f1677e56dcca794386e90299fc【参考方案2】:我想我会提出自己的解决方案,因为我希望它比显示的其他答案更具可读性。
def cidr_to_netmask(cidr):
cidr = int(cidr)
mask = (0xffffffff >> (32 - cidr)) << (32 - cidr)
return (str( (0xff000000 & mask) >> 24) + '.' +
str( (0x00ff0000 & mask) >> 16) + '.' +
str( (0x0000ff00 & mask) >> 8) + '.' +
str( (0x000000ff & mask)))
现在更容易看到发生了什么,那就是:
-
通过在前面填充
1
s 并让cidr
构成其余部分来获取数字mask
对于每个位,应用mask
将所有位连接在一起,用句点分隔
这是非常程序化的,不使用任何库。
【讨论】:
【参考方案3】:试试这个解决方案:
Python3
from ipaddress import IPv4Network
networks = 'n1':'10.1.0.0/21','n2':'10.2.0.0/22','n3':'10.3.0.0/23','n4':'10.4.0.0/24'
for x,y in enumerate(networks):
print(IPv4Network(networks[y]).network_address, IPv4Network(networks[y]).netmask)
结果:
10.1.0.0 255.255.248.0
10.2.0.0 255.255.252.0
10.3.0.0 255.255.254.0
10.4.0.0 255.255.255.0
Python2
from netaddr import IPNetwork
networks = 'n1':'10.1.0.0/21','n2':'10.2.0.0/22','n3':'10.3.0.0/23','n4':'10.4.0.0/24'
for x,y in enumerate(networks):
print(str(IPNetwork(networks[y]).network), str(IPNetwork(networks[y]).netmask))
结果:
('10.1.0.0', '255.255.248.0')
('10.2.0.0', '255.255.252.0')
('10.3.0.0', '255.255.254.0')
('10.4.0.0', '255.255.255.0')
【讨论】:
apt install python-netaddr
pypi.org/project/ipaddress 是“3.3+ ipaddress 模块到 2.6、2.7、3.2 的端口”,以防您仍然需要维护 Python2 代码并想使用 ipaddress
。【参考方案4】:
试试这个
lsIP = []
ans = 0
CIDR = 32
IP = [1] * CIDR
for i in range(len(IP)):
iIdx = i % 8
if iIdx == 0:
if i >= 8:
lsIP.append(ans)
ans = 0
ans += pow(2, 7 - iIdx)
lsIP.append(ans)
[lsIP.append(0) for i in range(4 - len(lsIP))]
print lsIP
【讨论】:
以上是关于在python中将cidr转换为子网掩码的主要内容,如果未能解决你的问题,请参考以下文章
网络层-第三节3:子网划分与子网掩码和无分类域间路由选择CIDR