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.
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
.
Dies konvertiert eine Ganzzahl in eine 2-stellige Hex-Zeichenfolge mit dem Präfix 0x:
strHex = "0x%0.2X" % 255
Was ist mit hex()
?
hex(255) # 0xff
Wenn Sie wirklich \
vor sich haben möchten, können Sie Folgendes tun:
print '\\' + hex(255)[1:]
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 "
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
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.
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
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
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)
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'
(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'
Als alternative Darstellung könnten Sie verwenden
[in] '%s' % hex(15)
[out]'0xf'