通过IP和掩码计算广播

Vla*_*ski 4 python ip-address broadcast

我正在尝试通过逻辑OR而不是使用指定的IP和掩码来计算广播地址,但是func使我感到有些奇怪。为什么?

 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)))
Run Code Online (Sandbox Code Playgroud)

屏幕截图

gam*_*ero 5

与其优化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)
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)


Flo*_*mer 3

-64和192实际上与8位字节相同。您只需要屏蔽字节即可0xff获取更标准的 0\xe2\x80\xa6255 范围内的数字,而不是现在的 -128\xe2\x80\xa6127 范围内的数字。像这样的东西:

\n\n
broadcast = [(ioctet | ~moctet) & 0xff for ioctet, moctet in zip(ip, mask)]\n
Run Code Online (Sandbox Code Playgroud)\n