Antwort byte-weise auslesen

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
Ulrich_G
User
Beiträge: 17
Registriert: Montag 25. Juni 2018, 07:20

Hallo
würde gerne eine Antwort (Beispiel: b"\x04\x00\x00\x01\x00\x00\x01\x02\x06\x04\xb2\x05") byteweise auslesen
Hat jemand eine Idee wie ich das am besten umsetzen kann?

Wünschenswert wäre eine Funktion, bei der ich gezielt anfragen kann z.B. GetByte(4) ==> 01
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kannst du doch:

antwort[3] == 1

Indizes sind in Python wie in nahezu allen anderen Programmiersprachen 0-basiert. Byte 4 befindet sich also an Index 3. Und mit Python3 resultiert der Zugriff auf ein Byte im Bytestring gleich in einer Ganzzahl. In Python 2 musst du statt 1 '\x01' schreiben.
Ulrich_G
User
Beiträge: 17
Registriert: Montag 25. Juni 2018, 07:20

Danke schon mal ... aber was genau meinst du mit
mit Python3 resultiert der Zugriff auf ein Byte im Bytestring gleich in einer Ganzzahl
?
Meinst du damit, ich muss vor dem Auslesen des gewünschten Bytes mein Ergebnis ohne x und \ konvertieren, damit nur noch Ganzzahlen zur Verfügung stehen?
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Ulrich_G: was __deets__ meint, ist dass in Python2 der Zugriff über Index auf einen Bytesstring wieder zu einem Ein-Bytestring führte, in Python 3 aber zu einer Zahl. Braucht Dich aber nicht interessieren.

Wie ich aber schon in Deinem anderen Thread geantwortet habe, ist es Quatsch, einen Bytestring per str(...) in die Repräsentation eines Bytestrings zu verwandeln, weil man damit nichts mehr anfangen kann. Alles was Du tun mußt, ist `antwort[3]` zu schreiben.
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, was ich damit meine ist, das ein Zugriff auf ein einzelnes Element eines byte-string eine Zahl liefert.

Und du scheinst nicht ganz zu verstehen, was die Darstellung des Byte-Strings wirklich bedeutet, die du oben angegeben hast. Python kann, anders als andere Programmiersprachen, BELIEBIGE Byte-Strings darstellen. C zB kann das nicht, weil da eine 0 immer den String beendet.

Wenn ein solcher String dann ausgegeben wird, dann greift Python fuer die Darstellung von *nicht* druckbaren Zeichen (also allem ausserhalb ASCII) auf eine Darstellung als Hex-Zahl zu. Deswegen ist aber kein \ und kein x da drin, und da muss nix konvertiert werden!

Code: Alles auswählen

Python 3.6.3 (default, Oct  6 2017, 08:44:35)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> s = b'\x01\x02HALLO'
>>> s
b'\x01\x02HALLO'
>>> print(s)
b'\x01\x02HALLO'
>>> s[0]
1
Ulrich_G
User
Beiträge: 17
Registriert: Montag 25. Juni 2018, 07:20

Okay ... das ist ja wirklich sehr deutlich einfacher als ich das von vba gewohnt bin. Vielen dank.
Antworten