Comment convertir un int en une chaîne hexadécimale?

210

Je veux prendre un entier (qui sera <= 255), à une représentation de chaîne hexadécimale

par exemple: je veux 65entrer et sortir '\x41', ou 255et obtenir '\xff'.

J'ai essayé de le faire avec le struct.pack('c',65 ), mais cela étouffe tout ce qui précède 9car il veut prendre une seule chaîne de caractères.

pynoob
la source

Réponses:

214

Vous recherchez la chrfonction.

Vous semblez mélanger des représentations décimales d'entiers et des représentations hexadécimales d'entiers, donc ce n'est pas tout à fait clair ce dont vous avez besoin. Sur la base de la description que vous avez donnée, je pense que l'un de ces extraits montre ce que vous voulez.

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


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

Notez que cela est assez différent d' une chaîne contenant un entier sous forme hexadécimale . Si c'est ce que vous voulez, utilisez la fonction hexintégrée.

Mike Graham
la source
2
Je pensais que chr convertissait les entiers en ascii. Dans ce cas, chr (65) = 'A'. Est-ce un nouvel ajout?
deadthreetimes
2
@diedthreetimes, chrn'implique pas du tout ASCII - il prend simplement un nombre et crée une chaîne d'octets d'un octet où la valeur ordinale de l'octet est le nombre. Les encodages ASCII et ASCII compatibles entrent en jeu lorsque vous écrivez et affichez des bytestrings.
Mike Graham
1
@diedthreetimes, Par exemple, ils entrent en faisant 'A'une autre façon d'écrire et d'afficher '\x41'. Tout ce qui compte strvraiment, c'est le fait que ce soit soixante-cinq. Pour rendre les choses compréhensibles et utilisables par les humains, cela devient souvent un A.
Mike Graham
135

Cela convertira un entier en une chaîne hexadécimale à 2 chiffres avec le préfixe 0x:

strHex = "0x%0.2X" % 255
Greg Bray
la source
2
Je suggère de modifier le code ici et de le changer comme suit: strHex = "0x% 0.2X"% integerVariable. (Je n'ai pas pu me modifier.)
Samuel
58

Et alors hex()?

hex(255)  # 0xff

Si vous voulez vraiment avoir \devant vous, vous pouvez faire:

print '\\' + hex(255)[1:]
Felix Kling
la source
repr(chr(255)) # '\xff'y parvient également
Glenn 'devalias'
31

Permettez-moi d'ajouter celui-ci, car parfois vous voulez juste la représentation à un chiffre:

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

Et maintenant, avec les nouvelles f''chaînes de format, vous pouvez faire:

f'{15:x}'
> f

REMARQUE: le «f» initial f'{15:x}'est pour signifier une chaîne de format

monkut
la source
Pour référence sur cette fonctionnalité intéressante, PEP 498 - Interpolation de chaînes littérales
MFT
1
À mon humble avis, une option un peu plus «lisible» peut être au format «0x {: X}» (15) (notez que X est en majuscules). Pour 2034, il imprimera 0x7F2 au lieu de 7f2
Pavel Sapehin
11

Si vous souhaitez emballer une structure avec une valeur <255 (un octet non signé, uint8_t) et vous retrouver avec une chaîne d'un caractère, vous recherchez probablement le format B au lieu de c . C convertit un caractère en chaîne (pas trop utile en soi) tandis que B convertit un entier.

struct.pack('B', 65)

(Et oui, 65 est \ x41, pas \ x65.)

La classe struct gérera également facilement l'endianisme pour la communication ou d'autres utilisations.

XTL
la source
Le temps qu'il m'a fallu pour trouver struct.pack ('B', <entier>) est stupéfiant. Je vous remercie.
Sean D.
7

Notez que pour les grandes valeurs, hex()fonctionne toujours (certaines autres réponses ne le font pas):

x = hex(349593196107334030177678842158399357)
print(x)

Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3:0x4354467b746f6f5f736d616c6c3f7d

Pour un message RSA déchiffré, on pourrait faire ce qui suit:

import binascii

hexadecimals = hex(349593196107334030177678842158399357)

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

Cela a fonctionné le mieux pour moi

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

Changez le (2) si vous voulez un nombre avec une plus grande largeur (2 est pour 2 caractères imprimés hexadécimaux) donc 3 vous donnera ce qui suit

"0x%03X" % 5  # => 0x005
"0x%03X" % 17 # => 0x011
shakram02
la source
3

Je voulais un entier aléatoire converti en une chaîne hexadécimale à six chiffres avec un # au début. Pour l'obtenir, j'ai utilisé

"#%6x" % random.randint(0xFFFFFF)
ncmathsadist
la source
6
Je suppose que tu veux dire "#%6x" % random.randint(0x0, 0xFFFFFF). (Il manque un %avant 6et randintprend 2 paramètres -basses inférieure et supérieure-)
pacha
5
devrait être% 06x si vous ne voulez pas d'espace
Janus Troelsen
3

Avec format(), selon les exemples de format , nous pouvons faire:

>>> # 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'
Carte
la source
2
(int_variable).to_bytes(bytes_length, byteorder='big'|'little').hex()

Par exemple:

>>> (434).to_bytes(4, byteorder='big').hex()
'000001b2'
>>> (434).to_bytes(4, byteorder='little').hex()
'b2010000'
Chengcheng Zhang
la source
1

Vous pouvez également convertir n'importe quel nombre dans n'importe quelle base en hex. Utilisez ce code d'une ligne ici, il est facile et simple à utiliser:

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

Vous avez une chaîne nqui est votre numéro et x la base de ce numéro. Tout d'abord, changez-le en entier, puis en hexadécimal, mais hex a 0xau premier de celui-ci donc avec replacenous le supprimons.

Izak Sensei
la source
-1

Comme représentation alternative, vous pouvez utiliser

[in] '%s' % hex(15)
[out]'0xf'
Uzumaki
la source