Seite 1 von 1

Typecast o.ä. von Liste zu int

Verfasst: Freitag 26. März 2010, 11:38
von FabianB
Hallo zusammen,

ich bekomme über eine Schnittstelle eine 32bit Integer Zahl in Form von 4 Einzelbytes übertragen. Diese habe ich dann in einer Liste (Bytearray). Nun möchte ich gerne die Liste wieder als Integer umformatieren um damit weiter zu rechnen!
Eine Art Typecast, oder einen direkten Speicherzugriff wie es z.B. in C möglich ist habe ich nicht gefunden!
Daraufhin habe ich mir die Integerzahl einfach
"zusammengerechnet". D.h. Einzelbytes entsprechend der Wertigkeit geshiftet und dann zusammenaddiert!

Soweit läuft das auch, allerdings mache ich dabei auch aus dem signed Integer einen unsigned Integer, d.h. negative Werte werden als Werte > 2^15 dargestellt!

Gibt es hier eine elegante Art dieses Problem zu lösen?

Bsp:

Code: Alles auswählen

liste_pos = [211, 4, 0, 0]
liste_neg = [211, 4, 254, 254]

zahl_pos = liste_pos[3]*pow(2,24) + liste_pos[2]*pow(2,16) + liste_pos[1]*pow(2,8) + liste_pos[0]
zahl_neg = liste_neg[3]*pow(2,24) + liste_neg[2]*pow(2,16) + liste_neg[1]*pow(2,8) + liste_neg[0] 

print zahl_pos
>>>1235
print zahl_neg
>>>427806024
Gruß Fabian

Verfasst: Freitag 26. März 2010, 11:58
von mkesper
Schau mal, ob structdas bietet, was du brauchst.

Verfasst: Montag 29. März 2010, 09:48
von FabianB
Hallo,

danke für die schnelle Antwort. Ich habe mir die Beschreibung angeschaut, ... ich könnte mir vorstellen, das es damit funktioniert, allerdings habe ich es nicht auf anhieb zum Laufen bekommen. ... Naja ich suche mal weiter nach Beispielen und schau dann mal ob es damit geht.

Falls du allerdings ein passendes Beispiel dafür hast wäre ich dir sehr dankbar!

Gruß Fabian

Verfasst: Montag 29. März 2010, 10:43
von HWK

Code: Alles auswählen

>>> struct.unpack('l', ''.join(map(chr,[211, 4, 0, 0])))
(1235,)
>>> struct.unpack('l', ''.join(map(chr,[211, 4, 254, 254])))
(-16907053,)
MfG
HWK

Verfasst: Montag 29. März 2010, 12:14
von mkesper
@HWK: Gerade im Moment habe ich es auch herausgefunden. ;)
Ohne chr() geht's wohl nicht...

Verfasst: Montag 29. März 2010, 12:14
von FabianB
Hallo,
vielen Dank für das Beispiel. ... Ich hatte übersehen, dass man die Daten als String umformatieren muss!

Gruß Fabian