String zu Hex-Array konvertieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tom200
User
Beiträge: 4
Registriert: Dienstag 3. November 2015, 15:32


Wie konvertiere ich einen String
z.B. "TEST" in ein Hex Array (0x54, 0x45, 0x53, 0x54) in Python 3.

Ich habe diverse Beiträge gelesen, komme aber nicht zu Ziel!
Vielen Dank!
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Hallo,


was hast du denn bisher probiert?
Wie sieht dein bisheriger Code aus?
Große Probleme wenn möglich immer in kleine Probleme aufteilen.


Zwei Module können dir bei der Lösung deines Problems helfen: codecs / binascii.
tom200
User
Beiträge: 4
Registriert: Dienstag 3. November 2015, 15:32

Ich kämpfe mich von einem Codebeispiel zum nächsten.

grundsätzlich funktioniert dieses Beispiel:

import binascii

x= b'TEST'
x = binascii.hexlify(x)
y = str(x,'ascii')

print(x)
print(y)

Nur weiß ich erstens nicht, wie ich meinen String "TEST" in x=b'TEST' implenentiere und zum zweiten passt das Ausgabeformat nicht.
Ich drehe mich einfach im Kreis, vermute aber dass es ein ganz einfache Lösung gibt.
Danke für jeden Tip!
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Hallo,



wie ein STRING nach BYTES konvertiert wird lässt sich leicht über Google herausfinden.

Code: Alles auswählen

>>>import codecs
>>>test = "hi"
>>>test
'hi'
>>>test = codecs.encode(test)
>>>test
b'hi'
Mit format hast du die Möglichkeit ein '0x' voranzustellen.

Code: Alles auswählen

>>>test = "hi"
>>>for spell in test:
...    "0:#x".format(spell)
...
'0x68'
'0x69'
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

tom200 hat geschrieben:Wie konvertiere ich einen String
z.B. "TEST" in ein Hex Array (0x54, 0x45, 0x53, 0x54) in Python 3.
Das ist doch lediglich eine andere Darstellungsart. Ist wirklich - gemäß des bisherigen Vorschlags - eine Zeichenkette gemeint, die hexadezimale Werte beschreibt? In welchem Zusammenhang benötigst du das?
alienskin
User
Beiträge: 6
Registriert: Dienstag 2. Mai 2017, 08:39

Eine Möglichkeit wäre:

Code: Alles auswählen

>>> test = 'TEST'
>>> mybytes = bytearray()
>>> mybytes.extend(map(ord, test))
>>> print('test: ' + str(mybytes.hex()))
test: 54455354
Wenn es von einer Ganzzahl kommt:

Code: Alles auswählen

>>> zahl = 123456
>>> zbytes = zahl.to_bytes(4, byteorder='big', signed=False)
>>> print('zahl:' + str(zbytes.hex()))
zahl:0001e240
Da kannst Du dann die Länge mitbestimmen...
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@alienskin: Deine Möglichkeit funktioniert nur, solange der String test nur Zeichen mit einem Codepoint <256 enthält. Und dann wäre es besser, das Encoding explizit anzugeben, also:

Code: Alles auswählen

>>> test = "TEST"
>>> bytes = bytearray(test, "latin1")
>>> print('test: {}'.format(bytes.hex())
test: 54455354
wobei hier der my-Präfix weggelassen wurde, da er keinen Informationsgehalt hat, .format benutzt wird statt + und das Ergebnis von hex nicht per str in einen String verwandelt wurde, da das Ergebnis schon ein String ist.

Statt eines bytearrays reicht hier aber auch ein bytes-Objekt, da Du ja den Inhalt nicht ändern möchtest:

Code: Alles auswählen

>>> test = "TEST"
>>> print('test: {}'.format(test.encode('latin1').hex())
test: 54455354
tom200
User
Beiträge: 4
Registriert: Dienstag 3. November 2015, 15:32

Danke Euch schon mal für die zahlreichen Hilfstellungen. Ich melde zurück mich sobald ich zum Testen komme.
tom200
User
Beiträge: 4
Registriert: Dienstag 3. November 2015, 15:32

Danke für die Hilfe -- funktioniert!
Antworten