【问题标题】:Calculate broadcast by IP and mask [duplicate]按IP和掩码计算广播[重复]
【发布时间】:2018-04-29 05:32:51
【问题描述】:

我正在尝试通过逻辑 OR 而不是使用指定的 ip 和掩码来计算广播地址,但函数返回给我一些奇怪的东西。为什么?

 IP = '192.168.32.16'
 MASK = '255.255.0.0' 

 def get_ID(ip, mask):
    ip = ip.split('.')
    mask = mask.split('.')
    ip = [int(bin(int(octet)), 2) for octet in ip]
    mask = [int(bin(int(octet)), 2) for octet in mask]
    subnet = [str(int(bin(ioctet & moctet), 2)) for ioctet, moctet in zip(ip, mask)]
    host = [str(int(bin(ioctet & ~moctet), 2)) for ioctet, moctet in zip(ip, mask)]
    broadcast = [str(int(bin(ioctet | ~moctet), 2)) for ioctet, moctet in zip(ip, mask)] # a mistake, i guess
    print('Subnet: {0}'.format('.'.join(subnet)))
    print('Host: {0}'.format('.'.join(host)))
    print('Broadcast address: {0}'.format('.'.join(broadcast)))

【问题讨论】:

标签: python ip-address broadcast


【解决方案1】:

-64 和 192 实际上与 8 位字节的值相同。您只需要使用 0xff 屏蔽字节,即可获得更标准的 0…255 范围内的数字,而不是现在的 -128…127 范围。像这样的:

broadcast = [(ioctet | ~moctet) & 0xff for ioctet, moctet in zip(ip, mask)]

【讨论】:

    【解决方案2】:

    不要优化 Python 代码,而是使用 ipaddress 模块来完成这项工作。 https://docs.python.org/3/library/ipaddress.html

    import ipaddress
    
    IP = '192.168.32.16'
    MASK = '255.255.0.0'
    
    host = ipaddress.IPv4Address(IP)
    net = ipaddress.IPv4Network(IP + '/' + MASK, False)
    print('IP:', IP)
    print('Mask:', MASK)
    print('Subnet:', ipaddress.IPv4Address(int(host) & int(net.netmask)))
    print('Host:', ipaddress.IPv4Address(int(host) & int(net.hostmask)))
    print('Broadcast:', net.broadcast_address)
    

    输出:

    IP: 192.168.32.16
    Mask: 255.255.0.0
    Subnet: 192.168.0.0
    Host: 0.0.32.16
    Broadcast: 192.168.255.255
    

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      相关资源
      最近更新 更多