Wie konvertiere ich ein int in eine hexadezimale Zeichenfolge?

210

Ich möchte eine Ganzzahl (das ist <= 255) zu einer Hex-String-Darstellung machen

zB: Ich möchte ein- 65und aussteigen '\x41'oder 255aussteigen '\xff'.

Ich habe versucht, dies mit der struct.pack('c',65 zu tun ), aber das drosselt alles oben, 9da es eine einzelne Zeichenkette aufnehmen möchte.

Pynoob
quelle

Antworten:

214

Sie suchen die chrFunktion.

Sie scheinen Dezimaldarstellungen von ganzen Zahlen und hexadezimale Darstellungen von ganzen Zahlen zu mischen, daher ist nicht ganz klar, was Sie benötigen. Basierend auf der Beschreibung, die Sie gegeben haben, denke ich, dass einer dieser Ausschnitte zeigt, was Sie wollen.

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


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

Beachten Sie, dass dies ganz anders ist als eine Zeichenfolge, die eine Ganzzahl als Hex enthält . Wenn Sie dies wünschen, verwenden Sie die integrierte hexFunktion.

Mike Graham
quelle
2
Ich dachte, chr konvertierte ganze Zahlen in ASCII. In diesem Fall ist chr (65) = 'A'. Ist das ein Neuzugang?
dreimal
2
@diedthreetimes chrbeinhaltet überhaupt kein ASCII - es nimmt einfach eine Zahl und erstellt einen Ein-Byte-Bytestring, bei dem der Ordnungswert des Bytes die Zahl ist. ASCII- und ASCII-kompatible Codierungen kommen beim Schreiben und Anzeigen von Bytestrings ins Spiel.
Mike Graham
1
@diedthreetimes, Zum Beispiel kommen sie herein, indem sie eine 'A'andere Art des Schreibens und Anzeigens machen '\x41'. Alles, was strwirklich wichtig ist, ist die Tatsache, dass dies fünfundsechzig ist. Um die Dinge für den Menschen verständlich und nutzbar zu machen, wird es oft zu einem A.
Mike Graham
133

Dadurch wird eine Ganzzahl in eine zweistellige Hex-Zeichenfolge mit dem Präfix 0x konvertiert:

strHex = "0x%0.2X" % 255
Greg Bray
quelle
2
Ich schlage vor, den Code hier zu bearbeiten und in folgenden zu ändern: strHex = "0x% 0.2X"% integerVariable. (Ich konnte mich nicht bearbeiten.)
Samuel
57

Was ist mit hex()?

hex(255)  # 0xff

Wenn Sie wirklich \vorne haben möchten, können Sie Folgendes tun:

print '\\' + hex(255)[1:]
Felix Kling
quelle
repr(chr(255)) # '\xff'erreicht dies auch
Glenn 'devalias'
43

Versuchen:

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

oder

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

In der Python-Dokumentation heißt es: "Behalten Sie dies unter Ihrem Kopfkissen: http://docs.python.org/library/index.html "

Dawid
quelle
31

Lassen Sie mich diesen hinzufügen, denn manchmal möchten Sie nur die einstellige Darstellung:

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

Und jetzt können Sie mit den neuen f''Formatzeichenfolgen Folgendes tun:

f'{15:x}'
> f

HINWEIS: Das anfängliche 'f' in f'{15:x}'bezeichnet eine Formatzeichenfolge

Mönch
quelle
Als Referenz für diese nette Funktion, PEP 498 - Literal String Interpolation
MFT
1
IMHO kann eine etwas "lesbarere" Option das Format "0x {: X}" (15) sein (Hinweis X ist in Großbuchstaben). Für 2034 wird 0x7F2 anstelle von 7f2 gedruckt
Pavel Sapehin
11

Wenn Sie eine Struktur mit einem Wert <255 (ein Byte ohne Vorzeichen, uint8_t) packen und am Ende eine Zeichenfolge mit einem Zeichen erhalten möchten, suchen Sie wahrscheinlich nach dem Format B anstelle von c . C konvertiert ein Zeichen in eine Zeichenfolge (für sich genommen nicht allzu nützlich), während B eine Ganzzahl konvertiert.

struct.pack('B', 65)

(Und ja, 65 ist \ x41, nicht \ x65.)

Die struct-Klasse verwaltet auch bequem Endianness für die Kommunikation oder andere Zwecke.

XTL
quelle
Die Zeit, die ich gebraucht habe, um struct.pack ('B', <Ganzzahl>) zu finden, ist atemberaubend. Danke dir.
Sean D.
7

Beachten Sie, dass bei großen Werten hex()immer noch funktioniert (einige andere Antworten nicht):

x = hex(349593196107334030177678842158399357)
print(x)

Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3:0x4354467b746f6f5f736d616c6c3f7d

Für eine entschlüsselte RSA-Nachricht könnte man Folgendes tun:

import binascii

hexadecimals = hex(349593196107334030177678842158399357)

print(binascii.unhexlify(hexadecimals[2:-1])) # python 2
print(binascii.unhexlify(hexadecimals[2:])) # python 3
Luc
quelle
5

Das hat bei mir am besten funktioniert

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

Ändern Sie die (2), wenn Sie eine Zahl mit einer größeren Breite wünschen (2 steht für 2 hexadezimale Zeichen), sodass 3 Folgendes ergibt

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

Ich wollte eine zufällige Ganzzahl, die in eine sechsstellige Hex-Zeichenfolge mit einem # am Anfang umgewandelt wurde. Um das zu bekommen, habe ich es benutzt

"#%6x" % random.randint(0xFFFFFF)
ncmathsadist
quelle
6
Ich nehme an, du meinst "#%6x" % random.randint(0x0, 0xFFFFFF). (Es fehlt ein %vorher 6und randintnimmt 2 Parameter - untere und obere Schranken-)
Pacha
5
sollte% 06x sein, wenn Sie keine Leerzeichen möchten
Janus Troelsen
3

Mit format(), anhand von Formatbeispielen , können wir Folgendes tun:

>>> # 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'
Karte
quelle
2
(int_variable).to_bytes(bytes_length, byteorder='big'|'little').hex()

Beispielsweise:

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

Sie können auch eine beliebige Zahl in einer beliebigen Basis in ein Hex umwandeln. Verwenden Sie diesen einzeiligen Code hier, es ist einfach und unkompliziert zu verwenden:

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

Sie haben eine Zeichenfolge n, die Ihre Nummer und x die Basis dieser Nummer ist. Ändern Sie es zuerst in Integer und dann in Hex, aber Hex hat es 0xam ersten, also replaceentfernen wir es.

Izak Sensei
quelle
-1

Als alternative Darstellung können Sie verwenden

[in] '%s' % hex(15)
[out]'0xf'
Uzumaki
quelle