Problem mit struct

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
GMAch
User
Beiträge: 26
Registriert: Dienstag 4. September 2018, 07:32

Hallo,

ich benutze struct um Kommandos in Binärcode um zuwandeln aber irgendwie produziert das Unsinn wenn ich Integres die größer als 5407 sind um zu wandeln.

für

Code: Alles auswählen

struct.pack('I',5407)
kriege ich noch die korrekten 4 Byte

Code: Alles auswählen

b'\x1f\x15\x00\x00'
für

Code: Alles auswählen

struct.pack('I',5408)
dann plötzlich nur 3 Bytes

Code: Alles auswählen

b' \x15\x00\x00'
und für noch größere Werte immer 3 Bytes mit irgendeinem Sonderzeichen oder Buchstaben z.B.:

Code: Alles auswählen

struct.pack('I',5409)
b'!\x15\x00\x00'
Kann mir jemand erklären was da schief läuft?
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du verguckst dich. Du bekommst immer 4 Bytes. Aber das ist ja auch ein String, diese 4-Byte-Sequenz. Und wenn eines deiner Bytes druckbar ist, also zB im ASCII definiert, dann ist zB bei dir das erste Zeichen ein Leerzeichen.
GMAch
User
Beiträge: 26
Registriert: Dienstag 4. September 2018, 07:32

Und wie bekomme ich Python dazu mir die Zahlen korrekt umzuwandeln?
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die SIND korrekt. Das erste Zeichen bei 5408 ist \x20, also hex 20. Und jetzt schauen wir in die ASCII-Tabelle, und bei \x20 ist das Leerzeichen definiert. Und dementsprechend gibt Python das erste Zeichen als ' ' aus. Das ist voellig korrekt. Die Byte-Sequenz ist richtig. Dein Problem ist nur die Darstellung bei einer Ausgabe mit print.

Was willst du denn danach mit diesen Daten machen?
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nur als Nachtrag: die Zahl 1095650881 wird zu ANNA:

Code: Alles auswählen

struct.pack("I", 1095650881)
b'ANNA'
So ist das nunmal mit Bytes, die man in einem Terminal ausgibt. Die werden nicht als Hex-Werte dargestellt. Wenn das nicht so waere, dann koennte man ja keine Textausgaben machen.
GMAch
User
Beiträge: 26
Registriert: Dienstag 4. September 2018, 07:32

__deets__ hat geschrieben: Mittwoch 5. September 2018, 11:04Was willst du denn danach mit diesen Daten machen?
Per Binär Protokoll ein USB-Gerät steuern.

Gibt es eine Möglichkeit sich die reinen Hex-Darstellung anzeigen zulassen? Ich würde halt gerne verifizieren können ob die Komandos richtig gebildet werden.
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@GMAch: `bytes`-Objekte haben eine `hex()`-Methode.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

@GMAch: __blackjack__ hat's ja schon erwaehnt. Wichtig aber: das ist NUR fuer die Darstellung! Verschicken musst du den original Bytestring!
GMAch
User
Beiträge: 26
Registriert: Dienstag 4. September 2018, 07:32

Ich hätte noch eine Kurze Frage:

Ich benutze die Binärcodes um ein USB Gerät zu steuern.

Die Antworten die ich vom Gerät bekomme sind ebenfalls binär. Wenn ich sie mir im Terminal Anzeigen lasse haben sie aber immer die Form

Code: Alles auswählen

array('B',[1,2,3,4,....])
statt

Code: Alles auswählen

b'\x01\x02\x03\x04....' 
kann mit jemand sagen wie ich das Anzeigeformat ändern kann?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie liest Du denn die Daten vom Gerät? Die Funktion scheint ein Array zurückzuliefern. Wenn Du ein Problem hast, mit Arrays zu arbeiten, dann schau mal in der Dokumentation von array, ob Du eine für Dich passende Methode findest.
GMAch
User
Beiträge: 26
Registriert: Dienstag 4. September 2018, 07:32

Zum Lesen benutze ich einfach die .read() methode von pyusb.
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du mal in die Python-Dokumentation von array geschaut?

https://docs.python.org/3/library/array.html
Antworten