Hexwerte in Float umwandeln

  • Hi,
    ich habe mal wieder ein kleines Problem.
    Ich möchte gerne Hexwerte in Floats umwandeln und komme damit gar nicht klar.
    Beispiel: 0x0000C03F wäre 1.5000

    Jetzt habe ich eine UDF _WinAPI_IntToFloat gefunden und mich erstmal gefreut. Dummerweise braucht die eine Integer. Doch wie bekomme ich nun eine Integer daraus?
    Ich habe es so probier:

    [autoit]


    $float = _WinAPI_IntToFloat(Int(0x0000C03F))

    [/autoit]

    Allerdings kommt da irgendwas ganz komische raus, auf jeden Fall nicht meine 1.5000. Kann mir jemand sagen, was ich falsch mache? Ist mein Ansatz komplett falsch oder habe ich nur irgendwo einen Fehler drin bzw. was vergessen?

    Einmal editiert, zuletzt von penta.phoenix (7. März 2010 um 15:44)

  • 0x0000C03F ist 49215.
    Int ist eine Ganzzahl, wenn du also einen Wert ein eine Int und dann in eine Float umwandelst, bleibt es eine ganze Zahl.

    Wie sollen Hexwerte Kommazahlen darstellen?

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • Ja, ich weiß. Wenn ich den Hexwert nur in eine Int umwandle kommt das raus.
    Wie ein Hexwert Kommazahlen beinhalten soll, weiß ich auch nicht. Ich habe allerdings eine Datei analysiert und in einem Programm die Float geändert. Und es änderte sich immer nur dieser Abschnitt.

    0000C03F ist laut Programm 1.5000

    Hab aber grad was rausgefunden:
    Wenn ich die Daten umdrehe, also 3FC00000, dann erhalte ich mit meinem Code tatsächlich eine Float(1.5).
    We möchte, kann mir das mit Floats in Hexwerten gerne erklären, die Lösung habe ich ja jetzt.

  • Zitat

    Wie ein Hexwert Kommazahlen beinhalten soll, weiß ich auch nicht.

    Per Definition...

    [autoit]

    $float=DllStructCreate("float") ;im Speicher eine Float erzeugen
    dllstructsetdata($float,1,1.5) ;und 1.5 hineinschreiben

    [/autoit][autoit][/autoit][autoit]

    $int=DllStructCreate("int",DllStructGetPtr($float)) ;diese Struct wird an die Position der Float erzeugt, per Definition eine Int
    ;also können wir aus einer Speicherstelle sowohl eine Float als auch eine Int auslesen

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    msgbox(0,"Zahlen", "float= "&hex(dllstructgetptr($float)) & @CRLF & _
    "int = "&hex(dllstructgetptr($int))& @CRLF & @CRLF & _
    "float= "&dllstructgetdata($float,1) & @CRLF & _
    "int = "&dllstructgetdata($int,1))

    [/autoit]

    vgl auch http://de.wikipedia.org/wiki/Gleitkommazahl


    Zitat

    Wenn ich die Daten umdrehe

    das wiederum hat mit der "Endianess" zu tun^^
    http://de.wikipedia.org/wiki/Byte-Reihenfolge