如何在 Python 中将 CIDR 前缀转换为点分四线网络掩码?
例如,如果前缀是12
我需要返回255.240.0.0
.
这是较轻方面的解决方案(无模块依赖项):
netmask = '.'.join([str((0xffffffff << (32 - len) >> i) & 0xff)
for i in [24, 16, 8, 0]])
你可以这样做:
def cidr(prefix):
return socket.inet_ntoa(struct.pack(">I", (0xffffffff << (32 - prefix)) & 0xffffffff))
这是一个更有效的:
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”作为掩码长度,即使我不喜欢使用函数名作为变量名。
还有另一种方法
>> 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'