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.

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.


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

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:]

repr(chr(255)) # '\xff'erreicht dies auch
Glenn 'devalias'


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


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.


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

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

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)

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'

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'

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.


-1

Als alternative Darstellung können Sie verwenden

[in] '%s' % hex(15)
[out]'0xf'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.