如何在Python中将CIDR前缀转换为点分四网络掩码?

时间:2014-04-28 22:09:37

标签: python cidr netmask

如何在Python中将CIDR前缀转换为点分四网络掩码?

例如,如果前缀为12,我需要返回255.240.0.0

4 个答案:

答案 0 :(得分:10)

这是一个更轻松的解决方案(没有模块依赖性):

netmask = '.'.join([str((0xffffffff << (32 - len) >> i) & 0xff)
                    for i in [24, 16, 8, 0]])

答案 1 :(得分:5)

你可以这样做:

def cidr(prefix):
    return socket.inet_ntoa(struct.pack(">I", (0xffffffff << (32 - prefix)) & 0xffffffff))

答案 2 :(得分:0)

这是一种更有效的方法:

netmask = 0xFFFFFFFF & (2**(32-len)-1)

或者,如果您难以计算F的数量:

netmask = (2**32-1) & ~ (2 ** (32-len)-1)

,现在可能甚至更有效率(尽管更难阅读):

netmask = (1<<32)-1 & ~ ((1 << (32-len))-1)

要获取掩码的dotted.quad版本,可以使用inet.ntoa转换上述网络掩码。
注意:为了与其他消息保持一致,即使我不喜欢使用函数名作为变量名,我也使用“ len”作为掩码长度。

答案 3 :(得分: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'