Transformar una dirección IP dada a binario con Python

Resuelto
Liloux -  
mamiemando Mensajes publicados 33228 Fecha de registro   Estado Moderador Última intervención   -
```python
def ip_vers_ip_binaire(ip):
octets = ip.split('.')
binaire = ''.join(format(int(octet), '08b') for octet in octets)
return binaire
```

7 respuestas

magouero Mensajes publicados 246 Estado Miembro 66
 
Hola,

En mi opinión, debes empezar separando la dirección 192.168 ... en un array de 4 elementos que están en 8 bits
luego escribes los 4 números uno tras otro sin nada entre ellos

Así que necesitas una función que divida con un separador que es el punto "." y que te dé los 4 números.

Luego un print con un formato binario en 8 bits.
En mi opinión, todo esto está en la documentación de Python.
Haz tu mercado :)

https://overapi.com/python
Índices:
existen las funciones:
str.split()
int()
bin()

--
PC seven,
Firefox,
Ratón con bola... :-b
1
Liloux
 
¡Muchas gracias por sus indicaciones, me pondré a ello y si encuentro algo se lo envío, ¡gracias de nuevo!
0
magouero Mensajes publicados 246 Estado Miembro 66 > Liloux
 
yo he encontrado :)

en lugar de bin() hay format(cosa,cosa)
1
Liloux > magouero Mensajes publicados 246 Estado Miembro
 
ahh sí, es verdad, gracias
0
yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   Ambassadeur 1 588
 
0
Liloux
 
Hola,

No busco la respuesta correcta, solo ayuda.
Ya he comenzado con esto:

def convertir(T): """ T es un arreglo de enteros, cuyos elementos son 0 o 1 y representan un entero escrito en binario. Devuelve el entero positivo cuya representación binaria está dada por el arreglo T """ n = len(T) dec_int = 0 # Inicialización del entero decimal cuya representación binaria tenemos for k in range(n): dec_int = dec_int + T[k] * 2 ** (n - 1 - k) return dec_int 


Pero si lo convierto en
str
el cálculo no se hace y tengo un error.
0
yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > Liloux
 
Hola,
¿puedes usar las etiquetas de código cuando compartes código: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

¿puedes mostrar cómo llamas a tu función?
¿tu función funciona bien?
0
Liloux > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
 
 def convertir(T) """ T es un arreglo de enteros, cuyos elementos son 0 o 1 y representan un entero escrito en binario. Devuelve el entero positivo cuya representación binaria es dada por el arreglo T """ n = len(T) dec_int = 0 #inicialización del entero decimal cuya representación binaria tenemos for k in range(n): dec_int=dec_int+T[k]*2**(n-1-k) return dec_int 
0
Liloux > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
 
Mi función funciona bien, pero creo que no me ayuda en nada porque transforma el binario en decimal y hay que hacer lo contrario.
Por lo que he entendido, tengo que tomar mis datos como el '192', transformarlos en binario añadiendo ceros si es necesario y luego "pegar" los datos para hacer un largo binario correspondiente a cada parte.
0
yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > Liloux
 
también lo creo.
1
mamiemando Mensajes publicados 33228 Fecha de registro   Estado Moderador Última intervención   7 940
 
Hola,

En relación con el mensaje #4, algunas precisiones.
  • En efecto, debes separar tu dirección IPv4 en 4 enteros. Cada uno de estos enteros debe estar entre 0 y 255 y, por lo tanto, ocupa un octeto (es decir, 4 enteros de 8 bits cada uno, así que una IPv4 corresponde a 4 * 8 = 32 bits). Para ello, puedes utilizar el método
    split()
    .


Ejemplo:

(x, y, z, t) = direccion_ip.split(".")
  • Puedes convertir una cadena de caracteres que contenga un entero (p. ej.,
    "192"
    ) en un entero con la función
    int()
    .


Ejemplo:

i = int("192")
  • Para cada uno de estos 4 enteros, puedes representarlo en forma binaria con la función
    bin()
    . Ejemplo:
    bin(192)
    . Pero verás que la cadena devuelta está precedida por
    "0b"
    . Si deseas eliminar este prefijo, basta con considerar la representación binaria obtenida a partir del segundo carácter.


Ejemplo:

b = bin(192)[2:]
  • Al concatenar estas cuatro cadenas obtendrás la representación binaria de tu dirección IP.


Buena suerte.
0
magouero Mensajes publicados 246 Estado Miembro 66
 
¿Entonces, encontrado? :)

--
PC seven,
Firefox,
Ratón de bola... :-b
0
Liloux
 
 ¡Sí! He hecho varias funciones para que mi función principal (ip_vers_ip_binaire(ip)) no sea demasiado grande 

 def decimal_en_binaire(a): """a es un entero positivo en base 10 Devuelve su valor convertido en base 2 en forma de cadena de caracteres """ bin_a = str(a%2) # Inicialización de la palabra binaria a = a // 2 while a!=0 : bin_a = str(a % 2) + bin_a a = a//2 return bin_a def ip_vers_liste(ip): """ip es una dirección ipv4 de tipo str Devuelve el arreglo de los octetos (en decimal de tipo int) """ tab_str = ip.split('.') tab_int= [int(k) for k in tab_str] #creación del arreglo que convierte tab_str(tipo str) a entero (tipo int) return tab_int def ip_vers_ip_binaire(ip): """ip es una dirección ipv4 de tipo str Devuelve la ip convirtiendo los octetos a binario y sin los puntos de separación. La ip devuelta es de tipo str """ ip =ip_vers_liste(ip) #transformación de una cadena de caracteres a lista n = len(ip) binn1='' # binn1 es una cadena de caracteres manque= '0' #manque sirve para añadir ceros y llegar a 8 bits para cada una de las 4 partes de la IP binn= '0' for i in range(4): binn= decimal_en_binaire(ip[i]) if len(binn)!=8: binn = manque*(8-len(binn))+ binn binn1= binn1 + binn return binn1 
0
magouero Mensajes publicados 246 Estado Miembro 66
 
Moi j'avais:

direccionIp = "192.168.0.1" # la dirección que queremos procesar print(direccionIp) # solo para depurar def ipEnBinario(direccionIp): toto = direccionIp.split('.') resultado = "" # inicializar resultado para tener formato de cadena for contador in toto: #print(contador) # solo para depurar resultado = resultado+format(int(contador),'08b') print(resultado) return 0 #ejecuta la acción ipEnBinario(direccionIp) 

--
PC siete,
Firefox,
Ratón con bola... :-b
0
Liloux
 
¡Ah sí, es mucho más corto que el mío y solo requiere una función! ¡Bien hecho y gracias!
0
mamiemando Mensajes publicados 33228 Fecha de registro   Estado Moderador Última intervención   7 940
 
Hola,

Puedes hacerlo más corto utilizando este truco:

def ip_a_ip_binaria(ipv4): return "".join( "{0:08b}".format(int(n)) for n in ipv4.split(".") ) print(ip_a_ip_binaria("192.168.0.1"))


Buena suerte
0
magouero Mensajes publicados 246 Estado Miembro 66
 
Bonjour mamie,

¿puede explicar el uso de FOR en su ejemplo? No entiendo lo que hace la parte en el join, es decir:
"{0:08b}".format(int(n)) for n in ipv4.split(".")


delante del for.
Para mí, el for no devuelve nada ya que no está seguido de ninguna instrucción.
Y la documentación de python 3.10.3 indica §8.3 para FOR:
"for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]"

parece que el ":" no es opcional, así que ya no entiendo por qué no da un error, pero bueno, digamos que sí. Y no tenemos nada para suite, así que no hay acción.

si simplificamos a
 n for n in ipv4.split(".")

Funciona y da 19216801, lógico.

Pero ¿cómo? ¿Puede explicar o enviar a un § de la documentación que me permita entender?

Gracias de antemano.
0
mamiemando Mensajes publicados 33228 Fecha de registro   Estado Moderador Última intervención   7 940 > magouero Mensajes publicados 246 Estado Miembro
 
Hola magouero,

Lo que te bloquea probablemente es que aún no conoces la sintaxis de los bucles
for
utilizada en las comprensiones de listas.

Esta sintaxis se aplica a una
list
, un
tuple
, un
dict
, un generador.

De hecho, se trata más bien de la sintaxis asociada a un generador que se pasa al constructor
list
, un
tuple
,
dict
.

En la sintaxis que ya conoces, la función que he indicado se reescribe:

def ip_vers_ip_binaire(ipv4): ma_liste = list() for n in ipv4.split("."): ma_liste.append("{0:08b}".format(int(n))) return "".join(ma_liste)


"{0:08b}".format(int(n))
significa "escribe el entero
n
en formato binario en un máximo de 8 caracteres añadiendo los posibles 0 a la izquierda que faltan para obtener 8 caracteres"
. Para más detalles, consulta este enlace.

Buena suerte
1
magouero Mensajes publicados 246 Estado Miembro 66 > mamiemando Mensajes publicados 33228 Fecha de registro   Estado Moderador Última intervención  
 
ok veo. Para el formato y el padding, ya lo tenía.

Pero, vaya, encontrar eso en la documentación sin saber cómo se llama...


Entonces, para aquellos que lean esta discusión:
miren
https://docs.python.org/3/tutorial/controlflow.html
luego: "expresión generadora"
https://docs.python.org/3/glossary.html#term-generator

Para los ejemplos y el interés del método, el enlace "generador" de arriba es muy bueno.

Gracias Mamiemando.
0
mamiemando Mensajes publicados 33228 Fecha de registro   Estado Moderador Última intervención   7 940 > magouero Mensajes publicados 246 Estado Miembro
 
Pero, cielo, para encontrar eso en la documentación sin saber cómo se llama ...

Sí, sí, lo sé, pero me vas a sonrojar :D Bueno, en realidad no tengo mérito exceptuando haber sabido buscar correctamente ;-)

Gracias Mamiemando.

De nada, ¡buena continuación! :-)
0