Come convertire un int in una stringa esadecimale?


210

Voglio prendere un numero intero (che sarà <= 255), a una rappresentazione di stringa esadecimale

ad esempio: voglio passare 65e uscire '\x41', o 255e ottenere '\xff'.

Ho provato a farlo con il struct.pack('c',65 ), ma questo soffoca su qualsiasi cosa sopra 9poiché vuole contenere una singola stringa di caratteri.

Risposte:


214

Stai cercando il chr funzione.

Sembra che tu stia mescolando rappresentazioni decimali di numeri interi e rappresentazioni esadecimali di numeri interi, quindi non è del tutto chiaro ciò di cui hai bisogno. Sulla base della descrizione che hai dato, penso che uno di questi frammenti mostri quello che vuoi.

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


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

Si noti che questo è abbastanza diverso da una stringa contenente un numero intero come esadecimale . Se è quello che vuoi, usa l' hexintegrato.


2
Pensavo che chr avesse convertito numeri interi in ASCII. Nel qual caso chr (65) = 'A'. È una nuova aggiunta?
morto il

2
@diedthreetimes, chrnon coinvolge affatto ASCII - prende semplicemente un numero e crea un byte bytestring dove il valore ordinale del byte è il numero. Le codifiche ASCII e ASCII compatibili entrano in gioco quando si scrivono e si visualizzano i bytestring.
Mike Graham,

1
@diedthreetimes, ad esempio, entrano creando 'A'un altro modo di scrivere e visualizzare '\x41'. Tutto ciò strche importa davvero è il fatto che siano sessantacinque. Per rendere le cose comprensibili e utilizzabili dagli umani, spesso diventa un A.
Mike Graham il

135

Questo convertirà un numero intero in una stringa esadecimale a 2 cifre con il prefisso 0x:

strHex = "0x%0.2X" % 255

2
Suggerisco di modificare il codice qui e cambiarlo in questo: strHex = "0x% 0.2X"% integerVariable. (Non sono stato in grado di modificare me stesso.)
Samuel



31

Lasciami aggiungere questo, perché a volte vuoi solo la rappresentazione a una cifra:

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

E ora con le nuove f''stringhe di formato puoi fare:

f'{15:x}'
> f

NOTA: la 'f' in iniziale f'{15:x}'è per indicare una stringa di formato


Per riferimento a questa caratteristica ordinata, PEP 498 - Interpolazione letterale di stringhe
MFT

1
IMHO, l'opzione un po 'più "leggibile" può essere' 0x {: X} '. Format (15) (nota X in maiuscolo). Per il 2034 stamperà 0x7F2 invece di 7f2
Pavel Sapehin il

11

Se vuoi impacchettare uno struct con un valore <255 (un byte senza segno, uint8_t) e finire con una stringa di un carattere, probabilmente stai cercando il formato B invece di c . C converte un carattere in una stringa (non troppo utile da solo) mentre B converte un numero intero.

struct.pack('B', 65)

(E sì, 65 è \ x41, non \ x65.)

La classe struct gestirà anche in modo conveniente l'endianità per la comunicazione o altri usi.


Il tempo che mi ci è voluto per trovare struct.pack ('B', <integer>) è sconcertante. Grazie.
Sean D.

7

Si noti che per valori di grandi dimensioni, hex()funziona ancora (alcune altre risposte no):

x = hex(349593196107334030177678842158399357)
print(x)

Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3:0x4354467b746f6f5f736d616c6c3f7d

Per un messaggio RSA decrittografato, si potrebbe fare quanto segue:

import binascii

hexadecimals = hex(349593196107334030177678842158399357)

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

5

Questo ha funzionato meglio per me

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

Cambia il (2) se vuoi un numero con una larghezza maggiore (2 è per 2 caratteri stampati esadecimali) in modo che 3 ti dia quanto segue

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

3

Volevo un numero intero casuale convertito in una stringa esadecimale a sei cifre con un # all'inizio. Per ottenere questo ho usato

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

6
Suppongo che tu intenda "#%6x" % random.randint(0x0, 0xFFFFFF). (C'è un mancante %prima 6e randintprende 2 parametri -Abbassare e bounds- alta)
Pacha

5
dovrebbe essere% 06x se non vuoi spazi
Janus Troelsen il

3

Con format(), come da esempio di formato , possiamo fare:

>>> # format also supports binary numbers
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'

2
(int_variable).to_bytes(bytes_length, byteorder='big'|'little').hex()

Per esempio:

>>> (434).to_bytes(4, byteorder='big').hex()
'000001b2'
>>> (434).to_bytes(4, byteorder='little').hex()
'b2010000'

1

Inoltre puoi convertire qualsiasi numero in qualsiasi base in esadecimale. Usa questo codice a una riga qui è facile e semplice da usare:

hex(int(n,x)).replace("0x","")

Hai una stringa nche è il tuo numero e x la base di quel numero. Per prima cosa, cambialo in numero intero e poi in esadecimale, ma hex ha 0xil primo di esso, quindi replacelo rimuoviamo.


-1

Come rappresentazione alternativa potresti usare

[in] '%s' % hex(15)
[out]'0xf'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.