¿Cuál es la mejor manera de convertir una cadena en este formulario en una dirección IP: "0200A8C0"
. Los "octetos" presentes en la cadena están en orden inverso, es decir, la cadena de ejemplo dada debería generar 192.168.0.2
.Convertir cadena hexadecimal "little endian" a dirección IP en Python
Respuesta
red es proporcionada por el módulo de socket.
Convertir una dirección de 32 bits embalado IPv4 (una cadena de cuatro caracteres de longitud) a su representación estándar cadena decimal con puntos (por ejemplo, ‘123.45.67.89’). Esto es útil cuando se conversa con un programa que usa la biblioteca C estándar y necesita objetos del tipo struct in_addr, que es el tipo C para los datos binarios empaquetados de 32 bits que esta función toma como argumento.
Puede traducir su cadena hexadecimal a packed ip
usando struct.pack()
y el pequeño endian, el formato largo sin signo.
>>> import socket
>>> import struct
>>> addr_long = int("0200A8C0",16)
>>> hex(addr_long)
'0x200a8c0'
>>> struct.pack("<L", addr_long)
'\xc0\xa8\x00\x02'
>>> socket.inet_ntoa(struct.pack("<L", addr_long))
'192.168.0.2'
>>>
se podría hacer algo como esto:
>>> s = '0200A8C0'
>>> octets = [s[i:i+2] for i in range(0, len(s), 2)]
>>> ip = [int(i, 16) for i in reversed(octets)]
>>> ip_formatted = '.'.join(str(i) for i in ip)
>>> print ip_formatted
192.168.0.2
La división octeto probablemente podría hacerse más elegante, pero no puedo pensar en una manera más simple de la parte superior de la cabeza.
EDIT: O en una línea:
>>> s = '0200A8C0'
>>> print '.'.join(str(int(i, 16)) for i in reversed([s[i:i+2] for i in range(0, len(s), 2)]))
192.168.0.2
sí teh agrupación en particular, llega a mí. no puedo encontrar una buena forma de "dividir" los octetos, y repetir _those_ en orden inverso, espero que alguien sepa –
@Max, la respuesta de Roger contiene una forma muy intrigante de hacer esto. –
>>> s = "0200A8C0"
>>> bytes = ["".join(x) for x in zip(*[iter(s)]*2)]
>>> bytes
['02', '00', 'A8', 'C0']
>>> bytes = [int(x, 16) for x in bytes]
>>> bytes
[2, 0, 168, 192]
>>> print ".".join(str(x) for x in reversed(bytes))
192.168.0.2
Es corto y claro; envuélvalo en una función con verificación de errores para satisfacer sus necesidades.
opciones de agrupamiento prácticas: la manipulación de direcciones
def group(iterable, n=2, missing=None, longest=True):
"""Group from a single iterable into groups of n.
Derived from http://bugs.python.org/issue1643
"""
if n < 1:
raise ValueError("invalid n")
args = (iter(iterable),) * n
if longest:
return itertools.izip_longest(*args, fillvalue=missing)
else:
return itertools.izip(*args)
def group_some(iterable, n=2):
"""Group from a single iterable into groups of at most n."""
if n < 1:
raise ValueError("invalid n")
iterable = iter(iterable)
while True:
L = list(itertools.islice(iterable, n))
if L:
yield L
else:
break
@Roger, ¿cómo funciona 'zip (* [iter (s)] * 2)'? Estoy muy interesado en eso. –
¡Esto es bastante hack! 'iter (s)' devuelve un iterador sobre la cadena. Multiplicando la lista de este iterador por 2 se crearán dos referencias ** para el mismo iterador **. 'zip()' devuelve una lista de tuplas que contiene un elemento de cada uno de sus argumentos. Como ambos argumentos son el mismo iterador, tomará dos veces para cada tupla y devolverá una tupla de cada uno de los dos caracteres adyacentes. Nunca hubiera pensado en intentar algo como esto. : D –
@Matt: Es el núcleo de la mayoría de las recetas de "agrupación" que he visto, y Max lo explicó bien. Se actualizará para incluir dos funciones cortas en esa línea. –
Mi intento:
a = '0200A8C0'
indices = range(0, 8, 2)
data = [str(int(a[x:x+2], 16)) for x in indices]
'.'.join(reversed(data))
- 1. Confusión en htons- little endian/big endian
- 2. C# little endian o big endian?
- 3. Convertir cadena de dirección IP a binario en Python
- 4. Little endian Vs Big endian
- 5. ¿Cómo convertir una matriz de bytes int a little endian?
- 6. Little/Big Endian
- 7. Cómo convertir una cadena de formato de dirección IP estándar a hexadecimal y larga?
- 8. Big-endian vs. little-endian machines
- 9. descodificación, little endian, descomprimido y matriz flotante
- 10. Convertir big endian a little endian al leer de un archivo binario
- 11. Servidor SQL binario (128) convertir de little endian a big endian
- 12. convertir int a flote a hexadecimal
- 13. Entero con signo Little-Endian
- 14. Convertir cadena hexadecimal a int
- 15. Convertir cadena hexadecimal a larga
- 16. Cómo convertir cadena a dirección IP y viceversa
- 17. Big endian o Little endian en la red?
- 18. Forma rápida de intercambiar bytes en un array de big endian a little endian en C#
- 19. (java) Escribiendo en el archivo little endian
- 20. Conversión de los valores de flotación de big endian a little endian
- 21. ¿Por qué es x86 little endian?
- 22. Little endian data y sha 256
- 23. [NSNetservice] a IP cadena de dirección
- 24. ¿Convertir de cadena ASCII codificada en hexadecimal a ASCII simple?
- 25. int a cadena hexadecimal
- 26. C# Dirección IP de cadena
- 27. Convertir cadena hexadecimal de 128 bits a base-36 cadena
- 28. Convertir cadena hexadecimal (hex) a una cadena binaria
- 29. En python, ¿cómo convertir una cadena ascii hexadecimal a una cadena binaria interna sin procesar?
- 30. ¿Cómo convertir un doble a hexadecimal?
La respuesta más útil, IMO. –
Quiere " Omnifarious
@Omnifarious, ¿cómo es exactamente su efecto "largo/int" aquí? –