【问题标题】:How to convert a CIDR prefix to a dotted-quad netmask in Python?如何在 Python 中将 CIDR 前缀转换为点分四线网络掩码?
【发布时间】:2014-06-14 15:29:11
【问题描述】:

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

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

【问题讨论】:

标签: python cidr netmask


【解决方案1】:

这里有一个较轻的解决方案(没有模块依赖):

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

【讨论】:

    【解决方案2】:

    你可以这样做:

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

    【讨论】:

    • 我在 python 3.4 中得到这个错误:struct.error: 'I' format requires 0 &lt;= number &lt;= 4294967295
    • 好的,我已经更新了答案以适应错误检查。
    【解决方案3】:

    这是一个更有效的方法:

    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' 作为掩码长度,即使我不喜欢使用函数名作为变量名。

    【讨论】:

      【解决方案4】:

      另一种方法

      >> 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'
      

      【讨论】:

        猜你喜欢
        • 2021-06-02
        • 2016-02-18
        • 2016-05-06
        • 1970-01-01
        • 2016-10-31
        • 1970-01-01
        • 2020-12-22
        • 2019-08-21
        • 2018-10-29
        相关资源
        最近更新 更多