2010-04-28 213 views
7

Como parte de una aplicación más grande, estoy tratando de convertir una dirección IP a binaria. El propósito es calcular posteriormente la dirección de difusión para el tráfico de Wake on LAN. Asumo que hay una manera mucho más eficiente de hacer esto, tal como estoy pensando. Que es dividir la dirección IP por octeto, agregar 0 al comienzo de cada octeto donde sea necesario, convertir cada octeto a binario, y luego combinar los resultados. ¿Debería estar mirando netaddr, enchufes o algo completamente diferente?Convertir cadena de dirección IP a binario en Python

Ejemplo: 192.168.1.1 a partir 11000000.10101000.00000001.00000001

+0

¿Está buscando para convertir una dirección IPv4 en su representación en número entero? ¿O a qué representación binaria estás tratando de convertir? – Nate

+1

Ejemplo: De 192.168.1.1 a 11000000.10101000.00000001.00000001 – pizzim13

+0

Esa es una forma extremadamente poco común de expresar direcciones IP. No creo que exista ningún módulo para producir o consumir ese formato. –

Respuesta

4

¿Usted piensa en algo como abajo?

ip = '192.168.1.1' 
print '.'.join([bin(int(x)+256)[3:] for x in ip.split('.')]) 

Estoy de acuerdo con los demás, es probable que deba evitar convertir a representación binaria para lograr lo que desea.

+0

Eso es lo que estaba buscando pero, No entiendo completamente cómo funciona. Entiendo que estás dividiendo la dirección IP por '.', Luego uniendo los resultados por a '.', y la conversión de un entero a binario, pero esto: "(x) +256) [3:] para x en", completamente perdido. ¿Puedes apuntar en la dirección correcta para buscar lo que estás haciendo? – pizzim13

+0

@ pizzim13: sin magia. Entendiste bien cómo funciona. El +256 está ahí para tener siempre un número binario de 9 bits, luego es fácil eliminar 0b1 al frente del número. – kriss

+0

@ pizzim13: y para la parte '[... for x in ...]', mire ** la comprensión de la lista ** en la documentación de python. – kriss

7

Es socket. inet_aton() ¿qué quieres?

+3

Parece que funciona: 'bin (struct.unpack ('! I', socket.inet_aton ('192.168.1.1')) [0])' -> ''0b11000000101010000000000100000001'' – jfs

3

propósito de ser para calcular posteriormente la dirección de difusión de despertador en el tráfico de LAN

ipaddr (ver PEP 3144):

import ipaddr 

print ipaddr.IPNetwork('192.168.1.1/24').broadcast 
# -> 192.168.1.255 

En Python 3.3, ipaddress module:

#!/usr/bin/env python3 
import ipaddress 

print(ipaddress.IPv4Network('192.162.1.1/24', strict=False).broadcast_address) 
# -> 192.168.1.255 

Para que coincida con el ejempl e en su pregunta exactamente:

# convert ip string to a binary number 
print(bin(int(ipaddress.IPv4Address('192.168.1.1')))) 
# -> 0b11000000101010000000000100000001 
1

Puede usar la función de formato de cadena para convertir los números a binarios. Hice esta función:

def ip2bin(ip): 
    octets = map(int, ip.split('/')[0].split('.')) # '1.2.3.4'=>[1, 2, 3, 4] 
    binary = '{0:08b}{1:08b}{2:08b}{3:08b}'.format(*octets) 
    range = int(ip.split('/')[1]) if '/' in ip else None 
    return binary[:range] if range else binary 

Esto devolverá una dirección IP binaria o rango de direcciones IP, por lo que puede utilizarlo para comprobar si una dirección IP está en un rango:

>>> ip2bin('255.255.127.0') 
'11111111111111110111111100000000' 
>>> ip2bin('255.255.127.0/24') 
'111111111111111101111111' 
>>> ip2bin('255.255.127.123').startswith(ip2bin('255.255.127.0/24')) 
True 
1

Definir dirección IP en la variable dirección IP

ipadd = "10.10.20.20" 

convertir en la lista

ip = ipadd.split(".") 

Ahora convertir la dirección IP en números binarios

print ('{0:08b}.{1:08b}.{2:08b}. 
    {3:08b}'.format(int(ip[0]),int(ip[1]),int(ip[2]),int(ip[3]))) 

00001010.00001010.00010100.00010100 
Cuestiones relacionadas