Як перетворити 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.