Jak przekonwertować int na ciąg szesnastkowy?

210

Chcę wziąć liczbę całkowitą (która będzie <= 255) do reprezentacji ciągu szesnastkowego

np .: Chcę 65wejść i wyjść '\x41'lub 255dostać '\xff'.

Próbowałem to zrobić z struct.pack('c',65 ), ale to dusi wszystko powyżej, 9ponieważ chce przyjąć ciąg znaków składający się z jednego znaku.

pynoob
źródło

Odpowiedzi:

214

Szukasz chrfunkcji.

Wygląda na to, że mieszasz dziesiętne reprezentacje liczb całkowitych i szesnastkowe reprezentacje liczb całkowitych, więc nie jest całkiem jasne, czego potrzebujesz. Na podstawie podanego opisu uważam, że jeden z tych fragmentów pokazuje, czego chcesz.

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


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

Zauważ, że różni się to od ciągu zawierającego liczbę całkowitą jako szesnastkową . Jeśli tego właśnie chcesz, użyj hexwbudowanego.

Mike Graham
źródło
2
Myślałem, że chr przekształcił liczby całkowite na ascii. W takim przypadku chr (65) = „A”. Czy to nowy dodatek?
umarło trzy razy
2
@diedthreetimes, w chrogóle nie obejmuje ASCII - po prostu pobiera liczbę i wykonuje bajt jednobajtowy, w którym wartością porządkową bajtu jest liczba. Kodowania zgodne z ASCII i ASCII wchodzą w grę, gdy piszesz i wyświetlasz bajtowanie.
Mike Graham
1
@diedthreetimes, Na przykład, wchodzą, tworząc 'A'inny sposób pisania i wyświetlania '\x41'. Wszystko, na czym strnaprawdę zależy, to fakt, że jest to sześćdziesiąt pięć. Aby uczynić rzeczy zrozumiałymi i użytecznymi dla ludzi, często staje się literą A.
Mike Graham
134

Spowoduje to konwersję liczby całkowitej na 2-cyfrowy ciąg szesnastkowy z przedrostkiem 0x:

strHex = "0x%0.2X" % 255
Greg Bray
źródło
2
Proponuję edytować kod tutaj i zmienić go na następujący: strHex = "0x% 0.2X"% integerVariable. (Nie byłem w stanie samodzielnie edytować.)
Samuel,
58

Co hex()?

hex(255)  # 0xff

Jeśli naprawdę chcesz mieć \z przodu, możesz:

print '\\' + hex(255)[1:]
Felix Kling
źródło
repr(chr(255)) # '\xff'osiąga to również
Glenn 'devalias'
31

Pozwól, że dodam ten, ponieważ czasami potrzebujesz tylko jednocyfrowej reprezentacji:

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

A teraz dzięki nowym f''ciągom formatującym możesz:

f'{15:x}'
> f

UWAGA: początkowe „f” w f'{15:x}'oznacza ciąg formatu

monkut
źródło
Aby zapoznać się z tą ciekawą cechą, PEP 498 - Dosłowna interpolacja ciągów znaków
MFT
1
IMHO, nieco bardziej „czytelną” opcją może być „0x {: X}”. Format (15) (uwaga X jest pisana wielkimi literami). W roku 2034 wydrukuje 0x7F2 zamiast 7f2
Pavel Sapehin
11

Jeśli chcesz spakować strukturę o wartości <255 (jeden bajt bez znaku, uint8_t) i skończyć ciągiem jednego znaku, prawdopodobnie szukasz formatu B zamiast c . C konwertuje znak na ciąg (sam w sobie niezbyt użyteczny), podczas gdy B konwertuje liczbę całkowitą.

struct.pack('B', 65)

(I tak, 65 to \ x41, a nie \ x65.)

Klasa struct również wygodnie poradzi sobie z endianizmem w komunikacji lub innych zastosowaniach.

XTL
źródło
Czas, jaki zajęło mi znalezienie struct.pack ('B', <integer>) jest oszałamiający. Dziękuję Ci.
Sean D.
7

Pamiętaj, że w przypadku dużych wartości hex()nadal działa (niektóre inne odpowiedzi nie):

x = hex(349593196107334030177678842158399357)
print(x)

Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3:0x4354467b746f6f5f736d616c6c3f7d

W przypadku odszyfrowanego komunikatu RSA można wykonać następujące czynności:

import binascii

hexadecimals = hex(349593196107334030177678842158399357)

print(binascii.unhexlify(hexadecimals[2:-1])) # python 2
print(binascii.unhexlify(hexadecimals[2:])) # python 3
Luc
źródło
5

To działało dla mnie najlepiej

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

Zmień (2), jeśli chcesz liczbę o większej szerokości (2 dotyczy 2 znaków drukowanych heksadecymalnie), więc 3 da ci następujące

"0x%03X" % 5  # => 0x005
"0x%03X" % 17 # => 0x011
shakram02
źródło
3

Chciałem, aby losowa liczba całkowita została przekształcona w sześciocyfrowy ciąg szesnastkowy ze znakiem # na początku. Aby to uzyskać, użyłem

"#%6x" % random.randint(0xFFFFFF)
ncmathsadist
źródło
6
Chyba masz na myśli "#%6x" % random.randint(0x0, 0xFFFFFF). (Brakuje %wcześniej 6i randintzajmuje 2 parametry - dolną i górną granicę
pacha
5
powinno być% 06x, jeśli nie chcesz spacji
Janus Troelsen
3

Za pomocą format(), zgodnie z przykładami formatu , możemy:

>>> # 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'
Mapa
źródło
2
(int_variable).to_bytes(bytes_length, byteorder='big'|'little').hex()

Na przykład:

>>> (434).to_bytes(4, byteorder='big').hex()
'000001b2'
>>> (434).to_bytes(4, byteorder='little').hex()
'b2010000'
Chengcheng Zhang
źródło
1

Możesz także przekonwertować dowolną liczbę w dowolnej bazie na heks. Użyj tego kodu jednego wiersza tutaj, jest łatwy i prosty w użyciu:

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

Masz ciąg znaków, nktóry jest twoim numerem i x podstawą tego numeru. Najpierw zmień go na liczbę całkowitą, a następnie na hex, ale hex ma 0xna początku, więc wraz z replacenim usuwamy.

Izak Sensei
źródło
-1

Jako alternatywną reprezentację możesz użyć

[in] '%s' % hex(15)
[out]'0xf'
uzumaki
źródło