Seite 1 von 1

Integer Binärdarstellung als Float interpretieren

Verfasst: Freitag 23. Juli 2010, 16:56
von Thomas_W123
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

Re: Integer Binärdarstellung als Float interpretieren

Verfasst: Freitag 23. Juli 2010, 17:13
von DaMutz
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

Re: Integer Binärdarstellung als Float interpretieren

Verfasst: Freitag 23. Juli 2010, 17:27
von Thomas_W123
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.

Re: Integer Binärdarstellung als Float interpretieren

Verfasst: Freitag 23. Juli 2010, 17:32
von ms4py
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

Re: Integer Binärdarstellung als Float interpretieren

Verfasst: Freitag 23. Juli 2010, 17:36
von Rebecca
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 @'

Re: Integer Binärdarstellung als Float interpretieren

Verfasst: Freitag 23. Juli 2010, 17:40
von ms4py
Das sind eben die 4 Bytes. Die lassen sich unterschiedlich darstellen, wie oben gezeigt.

Re: Integer Binärdarstellung als Float interpretieren

Verfasst: Samstag 31. Juli 2010, 13:12
von Thomas_W123
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.

Re: Integer Binärdarstellung als Float interpretieren

Verfasst: Samstag 31. Juli 2010, 18:30
von b.esser-wisser
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

Re: Integer Binärdarstellung als Float interpretieren

Verfasst: Samstag 31. Juli 2010, 21:10
von ms4py
Ich finde `comtypes` ganz gut.
http://pypi.python.org/pypi/comtypes

Re: Integer Binärdarstellung als Float interpretieren

Verfasst: Sonntag 1. August 2010, 11:59
von Thomas_W123
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.