2011-04-14 10 views
28

Necesito crear una cadena de dígitos hexadecimales a partir de una lista de enteros aleatorios (0-255). Cada dígito hexadecimal debe estar representado por dos personajes: 5 - "05", 16 - "10", etc.Formatear ints en cadena de hexadecimal

Ejemplo:

Input: [0,1,2,3,127,200,255], 
Output: 000102037fc8ff 

He conseguido llegar a:

#!/usr/bin/env python 

def format_me(nums): 
    result = "" 
    for i in nums: 
     if i <= 9: 
      result += "0%x" % i 
     else: 
      result += "%x" % i 
    return result 

print format_me([0,1,2,3,127,200,255]) 

Sin embargo, esto se ve un poco incómodo. ¿Hay alguna forma más simple?

Respuesta

38
''.join('%02x'%i for i in input) 
3
a = [0,1,2,3,127,200,255] 
print str.join("", ("%02x" % i for i in a)) 

impresiones

000102037fc8ff 

(Tenga en cuenta también que el código fallará para los números enteros en el intervalo de 10 a 15.)

30
>>> str(bytearray([0,1,2,3,127,200,255])).encode('hex') 
'000102037fc8ff' 
+3

+1 para una versión sin formatear% vudú –

10

Sin embargo, otra opción es binascii.hexlify:

a = [0,1,2,3,127,200,255] 
print binascii.hexlify(bytes(bytearray(a))) 

impresiones

000102037fc8ff 

Ésta es también la versión más rápida para las grandes cadenas en mi máquina.

En Python 2.7 o superior, se podría mejorar esto aún más mediante el uso de

binascii.hexlify(memoryview(bytearray(a))) 

guardar la copia creada por la llamada bytes.

65

simplemente para la corrección, utilizando la moderna .format() sintaxis:

>>> numbers = [1, 15, 255] 
>>> ''.join('{:02X}'.format(a) for a in numbers) 
'010FFF' 
8

Al igual que en mi otra respuesta, salvo la repetición de la cadena de formato:

>>> numbers = [1, 15, 255] 
>>> fmt = '{:02X}' * len(numbers) 
>>> fmt.format(*numbers) 
'010FFF' 
Cuestiones relacionadas