如何在Python中将CIDR前缀转换为点分四组的网络掩码?
我该如何在Python中把CIDR前缀转换成点分十进制的子网掩码呢?
比如说,如果前缀是 12
,我需要返回 255.240.0.0
。
4 个回答
0
还有另一种方法可以做到这一点
>> cidr=22
>> netmask = '.'.join([str((m>>(3-i)*8)&0xff) for i,m in enumerate([-1<<(32-cidr)]*4)])
>> print(netmask)
'255.255.252.0'
1
这是一个更高效的版本:
netmask = 0xFFFFFFFF & (2**(32-len)-1)
或者,如果你在计算F的数量时遇到困难:
netmask = (2**32-1) & ~ (2 ** (32-len)-1)
现在有一个可能更高效(虽然读起来有点难)的版本:
netmask = (1<<32)-1 & ~ ((1 << (32-len))-1)
要获取掩码的点分十进制版本,你可以使用inet.ntoa来转换上面的网络掩码。
注意:为了和其他信息保持一致,我使用了'len'作为掩码长度,尽管我不太喜欢把函数名当作变量名。
13
这里有一个比较简单的解决方案(不需要额外的模块依赖):
netmask = '.'.join([str((0xffffffff << (32 - len) >> i) & 0xff)
for i in [24, 16, 8, 0]])
6
你可以这样做:
def cidr(prefix):
return socket.inet_ntoa(struct.pack(">I", (0xffffffff << (32 - prefix)) & 0xffffffff))