Transformar una dirección IP dada a binario con Python
Resuelto
```python
def ip_vers_ip_binaire(ip):
octets = ip.split('.')
binaire = ''.join(format(int(octet), '08b') for octet in octets)
return binaire
```
def ip_vers_ip_binaire(ip):
octets = ip.split('.')
binaire = ''.join(format(int(octet), '08b') for octet in octets)
return binaire
```
7 respuestas
-
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 -
yg_be Mensajes publicados 23437 Fecha de registro Estado Colaborador Última intervención Ambassadeur 1 588
-
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 enstr
el cálculo no se hace y tengo un error. -
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? -
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
-
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. -
-
-
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ónint()
.
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. - 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
-
¿Entonces, encontrado? :)
--
PC seven,
Firefox,
Ratón de bola... :-b -
¡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 -
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 -
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-
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 an 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.- Hola magouero,
Lo que te bloquea probablemente es que aún no conoces la sintaxis de los buclesfor
utilizada en las comprensiones de listas.
Esta sintaxis se aplica a unalist
, untuple
, undict
, un generador.
De hecho, se trata más bien de la sintaxis asociada a un generador que se pasa al constructorlist
, untuple
,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 enteron
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 - 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.
-