Как преобразовать int в шестнадцатеричную строку?

210

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

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

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

pynoob
источник

Ответы:

214

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

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

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


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

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

Майк Грэм
источник
2
Я думал, что chr преобразовал целые числа в ascii. В этом случае chr (65) = «A». Это новое дополнение?
умер трижды
2
@diedthreetimes, chrвообще не включает ASCII - он просто берет число и создает однобайтовую строку байтов, где порядковый номер байта - это число. ASCII и ASCII-совместимые кодировки вступают в игру, когда вы пишете и отображаете строки байтов.
Майк Грэм
1
@diedthreetimes, например, они приходят, делая 'A'другой способ писать и отображать '\x41'. Все strдействительно волнует тот факт, что это шестьдесят пять. Чтобы сделать вещи понятными и полезными для людей, он часто становится А.
Майк Грэм
136

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

strHex = "0x%0.2X" % 255
Грег Брей
источник
2
Я предлагаю отредактировать код здесь и изменить его следующим образом: strHex = "0x% 0.2X"% integerVariable. (Я не мог редактировать себя.)
Самуил
58

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

hex(255)  # 0xff

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

print '\\' + hex(255)[1:]
Феликс Клинг
источник
repr(chr(255)) # '\xff'также добивается этого
Гленн 'devalias'
31

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

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

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

f'{15:x}'
> f

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

monkut
источник
Для справки об этой изящной функции, PEP 498 - Литеральная интерполяция строк
MFT
1
ИМХО, немного более «читаемым» вариантом может быть «0x {: X}». Format (15) (уведомление X в верхнем регистре). В 2034 году будет напечатано 0x7F2 вместо 7f2
Павел Сапехин
11

Если вы хотите упаковать структуру со значением <255 (один байт без знака, uint8_t) и в итоге получить строку из одного символа, вы, вероятно, ищете формат B вместо c . C преобразует символ в строку (сама по себе она не слишком полезна), а B преобразует целое число.

struct.pack('B', 65)

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

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

XTL
источник
Количество времени, которое понадобилось мне, чтобы найти struct.pack ('B', <integer>), ошеломляет. Спасибо.
Шон Д.
7

Обратите внимание, что для больших значений 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

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

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

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

"0x%03X" % 5  # => 0x005
"0x%03X" % 17 # => 0x011
shakram02
источник
3

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

"#%6x" % random.randint(0xFFFFFF)
ncmathsadist
источник
6
Я полагаю, вы имеете в виду "#%6x" % random.randint(0x0, 0xFFFFFF). (Существует не хватает , %прежде чем 6и randintпринимает 2 параметра : -Более и верхняя bounds-)
Pacha
5
должен быть% 06x, если вы не хотите пробелов
Янус Троелсен
3

С format(), в соответствии с форматом-примеров , мы можем сделать:

>>> # 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()

Например:

>>> (434).to_bytes(4, byteorder='big').hex()
'000001b2'
>>> (434).to_bytes(4, byteorder='little').hex()
'b2010000'
Чэнчэн Чжан
источник
1

Также вы можете конвертировать любое число в любой базе в гекс. Используйте этот однострочный код здесь легко и просто:

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

У вас есть строка, nкоторая является вашим номером и x основанием этого числа. Сначала измените его на целое, а затем на шестнадцатеричное, но гекс имеет 0xв начале, поэтому replaceмы удалим его.

Изак Сенсей
источник
-1

В качестве альтернативного представления вы можете использовать

[in] '%s' % hex(15)
[out]'0xf'
Узумаки
источник