it-swarm.com.de

Wie konvertiere ich ein int in einen Hex-String?

Ich möchte eine Ganzzahl (das ist <= 255) zu einer Hexadezimendarstellung

zb .: Ich möchte 65 übergeben und '\x41' rauskommen oder 255 und '\xff' abrufen.

Ich habe versucht, dies mit dem struct.pack('c',65) zu tun, aber dies drosselt alles oberhalb von 9, da es eine einzelne Zeichenfolge aufnehmen möchte.

175
pynoob

Sie suchen nach der Funktion chr.

Sie scheinen dezimale Darstellungen von ganzen Zahlen und hexadezimale Darstellungen von ganzen Zahlen zu mischen, daher ist nicht ganz klar, was Sie benötigen. Basierend auf der von Ihnen gegebenen Beschreibung, denke ich, zeigt einer dieser Schnipsel, was Sie wollen.

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


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

Beachten Sie, dass sich dies ganz von einer Zeichenfolge unterscheidet, die eine Ganzzahl als Hexadezimalzeichen enthält. Wenn Sie das möchten, verwenden Sie das eingebaute hex.

185
Mike Graham

Dies konvertiert eine Ganzzahl in eine 2-stellige Hex-Zeichenfolge mit dem Präfix 0x:

strHex = "0x%0.2X" % 255
121
Greg Bray

Was ist mit hex() ?

hex(255)  # 0xff

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

print '\\' + hex(255)[1:]
46
Felix Kling

Versuchen:

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

oder

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

Die Python-Dokumentation sagt: "Behalte dies unter Deinem Kissen: http://docs.python.org/library/index.html "

39
Dawid

Lassen Sie mich dies hinzufügen, da Sie manchmal nur die einstellige Darstellung wünschen:

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

Und jetzt können Sie mit den neuen Zeichenfolgen im f''-Format Folgendes tun:

f'{15:x}'
> f

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

17
monkut

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

struct.pack('B', 65)

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

In der struct-Klasse wird auch Endianness für die Kommunikation oder andere Zwecke verwendet.

10
XTL

Beachten Sie, dass hex() für große Werte 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
Luc

Das hat für mich am besten funktioniert

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

Ändern Sie die Zahl (2), wenn Sie eine Zahl mit größerer Breite wünschen (2 steht für 2 hexadezimale Zeichen), damit 3 die folgenden Werte ergibt

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

Ich wollte, dass eine zufällige Ganzzahl in eine sechsstellige Hex-Zeichenfolge mit einem # am Anfang umgewandelt wird. Um das zu bekommen, habe ich gebraucht

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

Mit format(), wie in format-Examples 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'
0
Map
(int_variable).to_bytes(bytes_length, byteorder='big'|'little').hex()

Zum Beispiel:

>>> (434).to_bytes(4, byteorder='big').hex()
'000001b2'
>>> (434).to_bytes(4, byteorder='little').hex()
'b2010000'
0

Als alternative Darstellung könnten Sie verwenden

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