Dezimal in Hex umwandeln

  • Guten Morgen zusammen

    Anscheinend bin ich zu blöd dazu. Ich möchte eine einfache dezimale Zahl (1688400696) in Hexadezimal umwandeln.
    Die Zahl 1688400696 sollte demnach 64A2F338 ergeben.
    Aber ich bekomme immer nur CE000000!

    Was mache ich falsch?

    [autoit]

    Hex(1688400696, 8)

    [/autoit]

    Danke für Eure Hilfe!
    Veronesi

    Einmal editiert, zuletzt von veronesi (14. Juli 2012 um 07:18)

  • Sorry,
    Ich habe die Antwort gefunden:
    Die "Zahl" 1688400696 ist noch keine richtige Zahl. Aber auch kein String....
    Naja, auf jeden Fall geht es mit
    Hex(Number($iNumber, 1), 8 )

    Veronesi

  • Hallo veronesi,

    ich bekomme das von dir erwartete Ergebnis zurück. Da ich allerdings noch 3.3.6.1 benutze denke ich das mit der neuen Version sich ein Bug eingeschlichen hat,

    mfg autoBert

  • Gibst du es wirklich exakt so ein wie im ersten Post oder kommt die Zahl irgendwo anders her?
    Denn CE000000 ist die Hexadezimaldarstellung der Gleitkommazahl 1688400696,0.
    64A2F338 hingegen ist die Hexadezimaldarstellung der Integer-Zahl 1688400696.

    Erst seit Version 3.3.8.0 kann Hex() auch Gleitkommadarstellungen zurückgeben.
    Das Problem was ich hier sehe ist aber das du nur eine Integerzahl übergibst und somit das korrekte Ergebnis herauskommen sollte.
    Stattdessen bekommst du aber die Gleitkommazahlendarstellung was ich hier bei mir so nicht reproduzieren kann.

    Noch skurriler finde ich dass du dieses Problem beheben kannst durch den Einsatz von Number().
    Ich war immer der Meinung das man mit Int() eine Variable explizit in einen Integer() wandeln kann und mit Number() in eine Gleitkommazahl.
    Stattdessen macht dir - deiner Beschreibung folgend - Number aus einer Gleitkommazahl eine Integer-Zahl.
    Mir ist daher nun keine Funktion mehr bekannt mit welcher man eine Variable explizit in eine Gleitkommazahl wandeln kann.

  • Exakt den gleichen Fehler habe ich bei mir auch.

    Hex bearbeitet alle Zahleneingaben ohne explizite Int zuweisung als Float.
    Deshalb nehme ich inzwischen immer Hex(Int($bla)), damit alles seinen gewohnten Gang nimmt.

    Als die Umstellung auf die 3.3.8.1 kam musste ich erstmal 50% meiner Skripte ummodeln^^

  • Ist das ein Bug oder ein Feature?

  • Ich denke schon das es ein Bug ist denn bei mir verhält sich das ganze nämlich genau anders herum als bei Marsi.
    Bei mir gibt Hex unter der 3.3.8.1 und der 3.3.9.4 Beta korrekt die Integer-Entsprechung zurück wenn ich einen Integer übergebe.

    @Marsi
    hast du mal mit VarGetType geprüft ob du der Hex-Funktion tatsächlich einen Integer übergibst?

  • Ah ich sehe es gerade.
    Meine Variablen sind als Double eingetragen.

    Warum das so ist weiß ich nicht.
    Sie sind als Int deklariert und es werden ausschließlich ganzzahlen addiert oder subtrahiert.
    Im Prinzip dürfte sich dadurch der Variablentyp nicht ändern.

    hier das Beispiel. (Es geht um den Lebensbalken bei Gegnern in Spielen von Grün nach Rot).

    [autoit]

    _Farbe(100)

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

    Func _Farbe($n)
    Local $r = 255, $g = 0, $b = 0
    For $i = 0 To $n Step 1
    $g += 5 * ($i < $n / 2 And $g < 250)
    $r -= 5 * ($i > $n / 2 And $r > 5)
    ConsoleWrite('RGB: ' & $r & ' ' & $g & ' ' & $b & @CRLF)
    ConsoleWrite('Hex: ' & Hex($r,2) & ' ' & Hex($g,2) & ' ' & Hex($b,2) & @CRLF)
    ConsoleWrite('HexInt: ' & Hex(Int($r),2) & ' ' & Hex(Int($g),2) & ' ' & Hex(Int($b),2) & @CRLF)
    ConsoleWrite(@CRLF)
    Next
    EndFunc

    [/autoit]

    Edit:
    Dann nehme ich das zurück. (der gleiche Fehler ist es nicht)
    Das kam mir nur so vor, da intern wohl fast alles als Double berechnet wird. Und daher Hex andauernd falsche Werte ausspuckte.

    Das Beispiel aus dem Startpost funktioniert bei mir wie es soll.

  • So wie ich das sehe führt AutoIt prinzipiell Divisionen als Gleitkommaoperation durch weil das Ergebnis ja auch eine Gleitkommazahl sein könnte.
    Entweder du wandelst das Ergebnis explizit mit Int() danach in einen Integer oder du machst per BitShift(x,1) deine Division durch 2 - dann bleibt es ebenfalls ein Integer.
    Aber ich denke so wie du es jetzt machst mit Hex(Int(x)) sollte es am sichersten sein.

  • Hallo Zusammen,

    Entschuldigt, aber ich konnte nicht früher antworten!

    Gibst du es wirklich exakt so ein wie im ersten Post oder kommt die Zahl irgendwo anders her?
    Denn CE000000 ist die Hexadezimaldarstellung der Gleitkommazahl 1688400696,0.
    64A2F338 hingegen ist die Hexadezimaldarstellung der Integer-Zahl 1688400696.

    Erst seit Version 3.3.8.0 kann Hex() auch Gleitkommadarstellungen zurückgeben.
    Das Problem was ich hier sehe ist aber das du nur eine Integerzahl übergibst und somit das korrekte Ergebnis herauskommen sollte.
    Stattdessen bekommst du aber die Gleitkommazahlendarstellung was ich hier bei mir so nicht reproduzieren kann. [...]

    Nein, die Zahl kommt wo anderst her. Vielen Dank für die Aufklärung bezüglich der Gleitkommazahl.
    Nun ist mir auch klar, warum meine Lösung mit Number funktioniert!

    Ich habe einfach intuitiv angenommen, dass die Zahl womöglich noch keine echte (integer) Zahl ist und sie deshalb mit Number (und dem entsprechenden Parameter) in eine INT Zahl verwandelt.

    Danke für die Diskusion.
    Gruss Veronesi