2010-02-16 23 views
139

quiero tomar un número entero (que será < = 255), con una representación de cadena hexadecimal¿Cómo convertir un int a una cadena hexagonal?

ej .: Quiero pasar en 65 y salir '\x41' o 255 y obtener '\xff'.

He intentado hacer esto con la , pero que se ahoga con algo por encima de 9 ya que quiere tomar en una sola cadena de caracteres.

Respuesta

152

Usted está buscando la función chr.

Parece que está mezclando representaciones decimales de enteros y representaciones hexadecimales de enteros, por lo que no está del todo claro lo que necesita. Según la descripción que proporcionó, creo que uno de estos fragmentos muestra lo que desea.

>>> chr(0x65) == '\x65' 
True 


>>> hex(65) 
'0x41' 
>>> chr(65) == '\x41' 
True 

Tenga en cuenta que esto es muy diferente de una cadena que contiene un entero como hexagonal. Si eso es lo que quiere, use el hex incorporado.

+0

Exactamente lo que estaba buscando. Gracias, no pude encontrar esa función por mi vida y sabía que tenía que haber algo más limpio que usar hex y reemplazarlo. – pynoob

+1

Pensé que chr convertía números enteros en ascii. En cuyo caso chr (65) = 'A'. ¿Es esto una nueva adición? – diedthreetimes

+2

@diedthreetimes, 'chr' no implica ASCII en absoluto; simplemente toma un número y crea una cadena de bytes de un byte donde el valor ordinal del byte es el número. Las codificaciones compatibles con ASCII y ASCII entran en juego cuando escribes y muestras cadenas de bytes. –

37

¿Qué hay de hex()?

hex(255) # 0xff 

Si realmente quiere tener \ delante que puede hacer:

print '\\' + hex(255)[1:] 
+0

'repr (chr (255)) # '\ xff'' también logra esto – devalias

93

Esto convertirá un entero a una cadena hexadecimal de 2 dígitos con el prefijo 0x:

strHex = "0x%0.2X" % 255 
+2

Esta respuesta probablemente resuelve el caso más común que las personas están interesadas en –

+0

Sugiero editar el código aquí y cambiarlo por esto: strHex =" 0x% 0.2X "% enteroVariable. (No pude editar yo mismo). – Samuel

8

Si desea empaquetar una estructura con un valor de < 255 (un byte sin signo, uint8_t) y terminar con una cadena de un carácter, probablemente esté buscando el format B instead of c. C convierte un carácter en una cadena (no demasiado útil por sí mismo) mientras que B convierte un número entero.

struct.pack('B', 65) 

(Y sí, el 65 es \ x41, x65 no \.)

La clase de estructura también se encargará convenientemente orden de bits para la comunicación u otros usos.

3

Quería un entero aleatorio convertido en una cadena hexadecimal de seis dígitos con un # al principio.Para conseguir esto he utilizado

"#%6x" % random.randint(0xFFFFFF) 
+6

Supongo que quiere decir '" #% 6x "% random.randint (0x0, 0xFFFFFF)'. (Falta un '%' antes de '6' y' randint' toma 2 parámetros -lower y los límites superiores-) – pacha

+5

debe ser% 06x si no desea espacios –

4

Tenga en cuenta que para valores grandes, hex() todavía funciona (algunas otras respuestas no lo hacen):

x = hex(349593196107334030177678842158399357) 
print(x) 

Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3: 0x4354467b746f6f5f736d616c6c3f7d

Para un mensaje RSA descifrado, se podría hacer lo siguiente:

import binascii 

hexadecimals = hex(349593196107334030177678842158399357) 

print(binascii.unhexlify(hexadecimals[2:-1])) # python 2 
print(binascii.unhexlify(hexadecimals[2:])) # python 3 
2

Esto funcionó mejor para mí

"0x%02X" % 5 # => 0x05 
"0x%02X" % 17 # => 0x11 

Cambiar el (2) si usted quiere un número con una anchura más grande (2 es para caracteres printned 2 hexagonales) para 3 le dará la siguiente

"0x%03X" % 5 # => 0x005 
"0x%03X" % 17 # => 0x011 
0

Como una representación alternativa se puede utilizar

[in] '%s' % hex(15) 
[out]'0xf' 
2

permítanme añadir éste, porque a veces lo que desea es la representación de un solo dígito:

'{:x}'.format(15) 
> f