Typecast o.ä. von Liste zu int

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
FabianB
User
Beiträge: 6
Registriert: Freitag 26. März 2010, 11:10

Freitag 26. März 2010, 11:38

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
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Freitag 26. März 2010, 11:58

Schau mal, ob structdas bietet, was du brauchst.
FabianB
User
Beiträge: 6
Registriert: Freitag 26. März 2010, 11:10

Montag 29. März 2010, 09:48

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
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Montag 29. März 2010, 10:43

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
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Montag 29. März 2010, 12:14

@HWK: Gerade im Moment habe ich es auch herausgefunden. ;)
Ohne chr() geht's wohl nicht...
FabianB
User
Beiträge: 6
Registriert: Freitag 26. März 2010, 11:10

Montag 29. März 2010, 12:14

Hallo,
vielen Dank für das Beispiel. ... Ich hatte übersehen, dass man die Daten als String umformatieren muss!

Gruß Fabian
Antworten