Как преобразовать int в шестнадцатеричную строку? - PullRequest
189 голосов
/ 16 февраля 2010

Я хочу взять целое число (которое будет <= 255) в шестнадцатеричное строковое представление </p>

например: я хочу пройти в 65 и выйти '\x41' или 255 и получить '\xff'.

Я пытался сделать это с struct.pack('c', 65 ), но это подавляет все, что выше 9, так как он хочет принять одну строку символов.

Ответы [ 12 ]

195 голосов
/ 16 февраля 2010

Вы ищете функцию chr.

Вы, кажется, смешиваете десятичные представления целых чисел и шестнадцатеричные представления целых чисел, поэтому не совсем понятно, что вам нужно. Основываясь на описании, которое вы дали, я думаю, что один из этих фрагментов показывает, что вы хотите.

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


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

Обратите внимание, что это весьма отличается от строки, содержащей целое число в виде шестнадцатеричного . Если это то, что вы хотите, используйте встроенный hex.

127 голосов
/ 16 февраля 2010

Это преобразует целое число в шестизначную шестнадцатеричную строку с префиксом 0x:

strHex = "0x%0.2X" % 255
51 голосов
/ 16 февраля 2010

А как насчет hex()?

hex(255)  # 0xff

Если вы действительно хотите иметь \ впереди, вы можете сделать:

print '\\' + hex(255)[1:]
41 голосов
/ 16 февраля 2010

Попробуйте:

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

или

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

Документация Python гласит: "держи это под своей подушкой: http://docs.python.org/library/index.html"

25 голосов
/ 20 сентября 2017

Позвольте мне добавить это, потому что иногда вам просто нужно однозначное представление:

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

А теперь с новыми строками формата f'' вы можете сделать:

f'{15:x}'
> f

ПРИМЕЧАНИЕ: начальная буква 'f' в f'{15:x}' должна означать строку формата

10 голосов
/ 19 сентября 2011

Если вы хотите упаковать структуру со значением <255 (один байт без знака, uint8_t) и получить строку из одного символа, вы, вероятно, ищете формат <a href="http://docs.python.org/library/struct.html#format-characters" rel="noreferrer"> B вместо c, C преобразует символ в строку (сама по себе она не слишком полезна), а B преобразует целое число.

struct.pack('B', 65)

(И да, 65 - это \ x41, а не \ x65.)

Класс struct также будет удобно обрабатывать порядковые номера для связи или других целей.

6 голосов
/ 06 октября 2016

Обратите внимание, что для больших значений hex() все еще работает (некоторые другие ответы не работают):

x = hex(349593196107334030177678842158399357)
print(x)

Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3: 0x4354467b746f6f5f736d616c6c3f7d

Для дешифрованного сообщения RSA можно сделать следующее:

import binascii

hexadecimals = hex(349593196107334030177678842158399357)

print(binascii.unhexlify(hexadecimals[2:-1])) # python 2
print(binascii.unhexlify(hexadecimals[2:])) # python 3
5 голосов
/ 10 июня 2017

Это сработало лучше для меня

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

Измените (2), если вы хотите число с большей шириной (2 для 2 шестнадцатеричных печатных символов), поэтому 3 даст вам следующее

"0x%03X" % 5  # => 0x005
"0x%03X" % 17 # => 0x011
3 голосов
/ 23 января 2012

Я хотел, чтобы случайное целое число было преобразовано в шестизначную шестнадцатеричную строку с # в начале. Чтобы получить это, я использовал

"#%6x" % random.randint(0xFFFFFF)
1 голос
/ 30 января 2019
(int_variable).to_bytes(bytes_length, byteorder='big'|'little').hex()

Например:

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