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
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:
Pero si lo convierto en
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
strel 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?
¿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.
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.
Ejemplo:
Ejemplo:
Ejemplo:
Buena suerte.
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.
¡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:
--
PC siete,
Firefox,
Ratón con bola... :-b
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:
Buena suerte
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:
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
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.
¿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.
Hola magouero,
Lo que te bloquea probablemente es que aún no conoces la sintaxis de los bucles
Esta sintaxis se aplica a una
De hecho, se trata más bien de la sintaxis asociada a un generador que se pasa al constructor
En la sintaxis que ya conoces, la función que he indicado se reescribe:
Buena suerte
Lo que te bloquea probablemente es que aún no conoces la sintaxis de los bucles
forutilizada 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 nen 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.
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.
en lugar de bin() hay format(cosa,cosa)