¿Cómo imprimir un entero con signo como número hexadecimal en complemento a dos con python?

Tengo un entero negativo (4 bytes) del cual me gustaría tener la forma hexadecimal de la representación del complemento de sus dos.

>>> i = int("-312367") >>> "{0}".format(i) '-312367' >>> "{0:x}".format(i) '-4c42f' 

Pero me gustaría ver “FF …”

Aquí hay una forma (para números de 16 bits):

 >>> x=-123 >>> hex(((abs(x) ^ 0xffff) + 1) & 0xffff) '0xff85' 

(Aunque podría no ser la forma más elegante)

 >>> x = -123 >>> bits = 16 >>> hex((1 << bits) + x) '0xff85' >>> bits = 32 >>> hex((1 << bits) + x) '0xffffff85' 

Usando el módulo de cadena de bits :

 >>> bitstring.BitArray('int:32=-312367').hex '0xfffb3bd1' 

Sencillo

 >>> hex((-4) & 0xFF) '0xfc' 

Para tratar un entero como un valor binario, debe hacer bitwise y con una máscara de la longitud de bit deseada.

Por ejemplo, para un valor de 4 bytes (32 bits), enmascaramos con 0xffffffff :

 >>> format(-1 & 0xffffffff, "08X") 'FFFFFFFF' >>> format(1 & 0xffffffff, "08X") '00000001' >>> format(123 & 0xffffffff, "08X") '0000007B' >>> format(-312367 & 0xffffffff, "08X") 'FFFB3BD1' 

El módulo de struct realiza conversiones entre los valores de Python y las estructuras de C representadas como objetos de bytes de Python. El objeto de bytes empaquetados ofrece acceso a valores de bytes individuales. Esto se puede usar para mostrar la representación de enteros subyacente (C).

 >>> packed = struct.pack('>i',i) # big-endian integer >>> type(packed)  >>> packed b'\xff\xfb;\xd1' >>> "%X%X%X%X" % tuple(packed) 'FFFB3BD1' >>>