Seite 1 von 1

Zweierkomplement

Verfasst: Freitag 31. März 2023, 13:31
von KolbenKeule
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

Re: Zweierkomplement

Verfasst: Freitag 31. März 2023, 13:57
von __deets__
Schau dir das Modul struct an, damit ist das trivial.

Re: Zweierkomplement

Verfasst: Donnerstag 6. April 2023, 08:52
von KolbenKeule
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?

Re: Zweierkomplement

Verfasst: Donnerstag 6. April 2023, 09:15
von __deets__
Du gibst ja auch nicht an, big endian zu benutzen.

Code: Alles auswählen

>>> struct.unpack_from(">3i", data, 1)
(-7808, -513378, -59550)

Re: Zweierkomplement

Verfasst: Donnerstag 6. April 2023, 09:49
von KolbenKeule
Vielen, vielen Dank
Es funktioniert jetzt :D

Eine Suche findet sein Ende

Re: Zweierkomplement

Verfasst: Donnerstag 6. April 2023, 10:01
von KolbenKeule
Ich hatte gedacht das der Befehl "socket.ntohl" die Struktur mit Big Endian übernimmt?!

Re: Zweierkomplement

Verfasst: Donnerstag 6. April 2023, 10:05
von __deets__
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.

Re: Zweierkomplement

Verfasst: Donnerstag 6. April 2023, 10:14
von KolbenKeule
Ach so, vielen Dank für die Erklärung.
Ich hoffe das es noch anderen hilft die auf der Suche sind :)