Integer Binärdarstellung als Float interpretieren

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
Thomas_W123
User
Beiträge: 8
Registriert: Freitag 23. Juli 2010, 16:49

Hallo Forum,
ich mache einen kleinen Test mit Blender, und darum muss ich mich etwas in Python einarbeiten.

Nun komme ich eher aus der C-Ecke, und brauche in Blender zur Anbindung an eine andere Software einer Interpratation der Bitdarstellung eines Integers (4 Byte) als ein float(4 Byte).
In C geht das mit Zeigern ja ganz einfach:

Code: Alles auswählen

int intVal = 1075838976; // Gleiche Binärdarstellung wie 2.5 float
float floatVal;
floatVal = *((float*) &intVal);
Ich habe schon sowas wie "pack" gefunden, aber das scheint auch nicht die richtige Richtung zu sein, weil das nur mit Strings zu arbeiten scheint.
Hat jemand einen heißen Tipp?

Gruß
Thomas
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

dein C in Python "übersetzt":

Code: Alles auswählen

import struct

i = 1075838976
a = struct.pack("i", i)
f = struct.unpack("f", a)[0]
print f # 2.5
Thomas_W123
User
Beiträge: 8
Registriert: Freitag 23. Juli 2010, 16:49

Danke, da lag ich mit struct ja nicht ganz falsch.

Nur steht in der Doku:
struct.pack(fmt, v1, v2, ...) returning a string containing the values v1, v2...

Aber ich kann mir mit "print a nicht anzeigen lassen.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Doch, `struct.pack` ist schon das Richtige:

Code: Alles auswählen

>>> from struct import pack, unpack
>>> val = pack('f', 2.5)
>>> val
'\x00\x00 @'
>>> unpack('i', val)
(1075838976,)
Edit:

Code: Alles auswählen

>>> len(val)
4
>>> for b in val:
...   print ord(b)
...
0
0
32
64
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Naja, an dem a selbst bist du ja warscheinlich nicht interessiert, sondern daran, wie es dann in der float-Darstellung aussieht. Da a ist da quasi nur ein Zwischenschritt und ist nicht so sonderlich spannend zu printen:

Code: Alles auswählen

>>> print a
 @
>>> print repr(a)
'\x00\x00 @'
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Das sind eben die 4 Bytes. Die lassen sich unterschiedlich darstellen, wie oben gezeigt.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Thomas_W123
User
Beiträge: 8
Registriert: Freitag 23. Juli 2010, 16:49

Ich bin noch auf ein weiteres kleines Problem mit dem Konvetieren von Daten gekommen.

Ich muss etwas ausholen was ich machen will:
Und zwar verwende ich unter Windows ein COM-Objekt deren Methoden ich aufrufe. Diese Methoden haben als Parameter eine Variable vom Typ Variant. Also die Methoden fragen intern den Datentyp des Parameters ab und handeln entsprechend.

Nun brauche ich aber einen Datentyp der z.B. 1 Byte oder 2 Byte lang ist. In Python ist aber alles mindestens 4 Byte lang.
Also mit der Methode wie oben mittels pack/unpack bekomme ich letztenendes immer einen mindestens 4 Byte Datentyp heraus.

Ich habe schon mit ctypes rumexperimentiert, aber sobals das durch den Python-Aufruf geht wird alles wieder auf 4 Byte aufgebläht. Zum Aufrufen der dll Funktionen verwende ich win32com.client.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Hast du die Formate "h", "H", "b", "B" beim struct-modul nicht gesehen?

Und das arbeiten mit dem COM-Kram geht wahrscheinlich besser mit pywin32

hth, Jörg
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Ich finde `comtypes` ganz gut.
http://pypi.python.org/pypi/comtypes
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Thomas_W123
User
Beiträge: 8
Registriert: Freitag 23. Juli 2010, 16:49

Ja, ich nutze derzeit pywin32 mit early Binding. Wie ich festgestellt habe ist es wohl ein Problem mit pywin32. Denn der Parameter ist vom Typ VT_VARIANT, und ich kann in Python anscheinend keinen VT_I2 oder VT_I1 Datentyp erzeugen. In irgendeiner Stelle der pywin Doku steht dann: ein COM Objekt dass sich so verhält sein defekt...nun denn. Ein VT_I4 funktioniert aber einwandfrei.

Ich schau mit mal das comtypes Package an. Laut Doku sieht es zumindest so aus als ob ich damit auch explizite Variablen mit COM-Datentypen erzeugen kann.
Antworten