2017-11-15 3 views
1

Ich versuche, Broadcast-Adresse durch logische ODER und nicht mit angegebenen IP und Maske zu berechnen, aber die Funktion zurück mich etw seltsam. Warum?Berechnen Broadcast von IP und Maske

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

screenshot

+1

Warum Sie Ihr Problem Schritt nicht für Schritt lösen und dann optimieren. Donald Knuth zitiert: "Vorzeitige Optimierung ist die Wurzel allen Übels in der Programmierung". Ich kann deinen Code nicht lesen. Meine Augen tun weh. –

+0

Warum tun Sie 'int (bin (int (Oktett)), 2)'? Das ist das gleiche wie 'int (Oktett)'. – Barmar

+0

Erfinden Sie das Rad nicht neu. Benutze die lib! https://docs.python.org/3/library/ipaddress.html#ipaddress.IPv4Network.broadcast_address –

Antwort

0

-64 und 192 sind tatsächlich der gleiche Wert wie 8-Bit-Bytes. Sie müssen nur die Bytes mit 0xff maskieren, um Zahlen im Standardbereich 0 ... 255 anstelle des jetzt verfügbaren Bereichs -128 ... 127 zu erhalten. Etwas wie folgt aus:

broadcast = [str(int(bin(ioctet | ~moctet), 2) & 0xff) for ioctet, moctet in zip(ip, mask)] 
1

Anstatt den Python-Code zu optimieren, verwenden Sie die ipaddress Modul die Arbeit zu tun. 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) 

OUTPUT:

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