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.
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
.
Ceci convertira un entier en une chaîne hexagonale à 2 chiffres avec le préfixe 0x:
strHex = "0x%0.2X" % 255
Qu'en est-il hex()
?
hex(255) # 0xff
Si vous voulez vraiment avoir \
devant, vous pouvez faire:
print '\\' + hex(255)[1:]
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 "
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
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.
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
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
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)
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'
(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'
Comme représentation alternative, vous pouvez utiliser
[in] '%s' % hex(15)
[out]'0xf'