web-dev-qa-db-fra.com

Comment convertir un int en une chaîne hexagonale?

Je veux prendre un entier (qui sera <= 255), en une représentation hexadécimale

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

J'ai essayé de faire cela avec le struct.pack('c',65), mais cela étouffe tout ce qui se trouve au-dessus de 9 puisqu'il veut intégrer une chaîne de caractères unique.

175
pynoob

Vous recherchez la fonction chr.

Vous semblez mélanger des représentations décimales d'entiers et des représentations hexadécimales d'entiers, de sorte que vos besoins ne sont pas tout à fait clairs. D'après la description que vous avez donnée, l'un de ces extraits montre ce que vous voulez.

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


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

Notez que ceci est assez différent de une chaîne contenant un entier hexadécimal . Si c'est ce que vous voulez, utilisez la variable intégrée hex.

185
Mike Graham

Ceci convertira un entier en une chaîne hexagonale à 2 chiffres avec le préfixe 0x:

strHex = "0x%0.2X" % 255
121
Greg Bray

Qu'en est-il hex() ?

hex(255)  # 0xff

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

print '\\' + hex(255)[1:]
46
Felix Kling

Essayer:

"0x%x" % 255 # => 0xff

ou

"0x%X" % 255 # => 0xFF

La documentation Python dit: "gardez ceci sous votre oreiller: http://docs.python.org/library/index.html "

39
Dawid

Permettez-moi d’ajouter celui-ci, car vous voulez parfois une représentation à un chiffre:

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

Et maintenant, avec les nouvelles chaînes de formatage f'', vous pouvez effectuer les tâches suivantes:

f'{15:x}'
> f

REMARQUE: le 'f' initial dans f'{15:x}' doit signifier une chaîne de format

17
monkut

Si vous voulez compresser une structure avec une valeur <255 (un octet non signé, uint8_t) et finir 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 très utile en lui-même) tandis que B convertit un entier.

struct.pack('B', 65)

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

La classe struct gérera facilement l’endianness pour la communication ou d’autres utilisations.

10
XTL

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

x = hex(349593196107334030177678842158399357)
print(x)

Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3: 0x4354467b746f6f5f736d616c6c3f7d

Pour un message RSA déchiffré, vous pouvez procéder comme suit:

import binascii

hexadecimals = hex(349593196107334030177678842158399357)

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

Cela a fonctionné mieux pour moi

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

Changez le (2) si vous voulez un nombre avec une largeur plus grande (2 correspond à 2 caractères imprimés), donc 3 vous donnera le suivant

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

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

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

Avec format(), selon format-examples , 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'
0
Map
(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'
0
Chengcheng Zhang

Comme représentation alternative, vous pouvez utiliser

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