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

6 投票
4 回答
7541 浏览
提问于 2025-04-18 04:39

我该如何在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))

撰写回答