Zweierkomplement

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
KolbenKeule
User
Beiträge: 9
Registriert: Freitag 31. März 2023, 13:20

Hallo,
ich bin neu hier und hoffe das ich auf diesem Weg etwas Hilfe bekommen kann bzw. später auch geben kann :)

Ich habe ein großes Problem mit einer Datenauswertung. Ich muss 4 Bytes mittels Zweierkomplement umrechnen und suche dafür schon seid mehreren Tagen im Netz nach einer Lösung.
Ich hoffe mir kann von ein paar Experten weiter geholfen werden.

Meine Datenausgabe sieht wie folgt aus:

Code: Alles auswählen

b'\xff\xff\xff\x84\x11\xff\xf8\x84\\\xff\xfe\x0f\xce'
ich benötige die letzten 4 Bytes für meine Formel und da die Übertragung bzw. der Empfang per Netzwerk kommt ist die Struktur BIG Endian.

Vielen Dank schonmal für die Hilfe.
Beste Grüße
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Schau dir das Modul struct an, damit ist das trivial.
KolbenKeule
User
Beiträge: 9
Registriert: Freitag 31. März 2023, 13:20

Vielen Dank für die schnelle Antwort, ich habe mich jetzt damit beschäftigt und bin auch zu einem Ergebnis gekommen aber leider ist der Fehler immer noch vorhanden( sobald das Ergebnis von den letzten 4 Bytes in der Rechnung negativ werden soll)
Mein derzeitiger Code:

Code: Alles auswählen

unpacked_struct = struct.unpack_from("3i", data, 1)
print(unpacked_struct)
test = socket.ntohl(unpacked_struct[2])/1000
print(test)

Code: Alles auswählen

data = b'\xff\xff\xff\xe1\x80\xff\xf8*\x9e\xff\xff\x17b'
unpacked_struct = (-2132672513, -1641350913, 1645740031)
test = 4294907.746'
Es müsste aber test = -59,5 rauskommen.

Kann mir dabei vielleicht jemand helfen?
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du gibst ja auch nicht an, big endian zu benutzen.

Code: Alles auswählen

>>> struct.unpack_from(">3i", data, 1)
(-7808, -513378, -59550)
KolbenKeule
User
Beiträge: 9
Registriert: Freitag 31. März 2023, 13:20

Vielen, vielen Dank
Es funktioniert jetzt :D

Eine Suche findet sein Ende
KolbenKeule
User
Beiträge: 9
Registriert: Freitag 31. März 2023, 13:20

Ich hatte gedacht das der Befehl "socket.ntohl" die Struktur mit Big Endian übernimmt?!
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Tut es auch, aber ignoriert dabei vorzeichen.

Code: Alles auswählen

>>> struct.unpack_from("3i", data, 1)
(-2132672513, -1641350913, 1645740031)
>>> socket.ntohl(1645740031)
4294907746
>>> struct.unpack("i", struct.pack("I", 4294907746))
(-59550,)
Das "funktioniert". Von hinten durch die Brust ins Auge.
KolbenKeule
User
Beiträge: 9
Registriert: Freitag 31. März 2023, 13:20

Ach so, vielen Dank für die Erklärung.
Ich hoffe das es noch anderen hilft die auf der Suche sind :)
Antworten