Як перетворити int в шістнадцяткову рядок?


210

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

наприклад: Я хочу пройти, 65вийти '\x41', або 255й дістати '\xff'.

Я намагався робити це з struct.pack('c',65 ), але це задихається про все вище, 9оскільки він хоче взяти в один рядок символів.

Відповіді:


214

Ви шукаєте chrфункцію.

Ви ніби змішуєте десяткові подання цілих чисел і шестинадцятих представлень цілих чисел, тому не зовсім зрозуміло, що вам потрібно. Виходячи з опису, який ви дали, я думаю, що один із цих фрагментів показує, що ви хочете.

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


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

Зауважте, що це сильно відрізняється від рядка, що містить ціле число як шістнадцяткове . Якщо це те, що ви хочете, використовуйте hexвбудований.


2
Я думав, що chr перетворив цілі числа в ascii. У такому випадку chr (65) = 'A'. Це нове доповнення?
— померли періоди

2
@diedthreasures chrвзагалі не включає ASCII - він просто бере число і робить однобайтовий бітестрінг, де порядкове значення байта - це число. ASCII та ASCII-сумісні кодування вступають у дію під час запису та відображення бітерест.
— Майк Грехем

1
@diedthreasures, Наприклад, вони входять, створивши 'A'інший спосіб писати та показувати '\x41'. Все, що strнасправді хвилює, це факт, що це шістдесят п’ять. Щоб зробити людиною зрозумілою та корисною, люди часто стають А.
— Майк Грем

134

Це перетворить ціле число у двозначний шістнадцятковий рядок із префіксом 0x:

strHex = "0x%0.2X" % 255

2
Я пропоную тут відредагувати код і змінити його на: strHex = "0x% 0.2X"% integerVariable. (Я не зміг редагувати себе.)
— Самуель,



31

Дозвольте додати це, бо іноді просто потрібно однозначне представлення:

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

А тепер з новими f''рядками формату ви можете:

f'{15:x}'
> f

ПРИМІТКА: початкове значення 'f' in f'{15:x}'означає позначення рядка формату


Для ознайомлення з цією акуратною особливістю, PEP 498 - Літеральна рядкова інтерполяція
— MFT

1
IMHO, трохи більш "читабельним" варіантом може бути формат "0x {: X}". У 2034 році він надрукує 0x7F2 замість 7f2
— Павло Сапехін

11

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

struct.pack('B', 65)

(І так, 65 - це \ x41, а не \ x65.)

Клас Stru також буде зручно обробляти нестабільність для спілкування чи іншого використання.


Кількість часу, яке знадобилося мені, щоб знайти 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 призначено для друкованих символів з двома шестигранними знаками), тому 3 дасть вам наступне

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

3

Я хотів, щоб випадкове ціле число перетворилося на шестицифровий шістнадцятковий рядок із символом # на початку. Щоб отримати це, я використав

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

6
Я гадаю, ти маєш на увазі "#%6x" % random.randint(0x0, 0xFFFFFF). (Існує НЕ вистачає , %перш ніж 6і randintприймає 2 параметра : -Більше і верхня bounds-)
— Pacha

5
має бути% 06x, якщо ви не хочете пробілів
— Janus Troelsen

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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.