mein Hex2Dec rechnet falsch :(

  • es rechnet falsch und ich weiss nicht warum :(
    entweder ist mir der fehler vorher nicht aufgefallen oder es liegt an 64 bit kompilierung oder dem update auf autoit 3.3.8.1
    ich gebe z.B. decimal ein: 30086629
    raus kommt 1CB15E0 ... was falsch ist! 1CB15E5 wäre richtig.

    [autoit]


    Func Hex2Dec($iN)
    MsgBox(0, "dec in:", $iN)
    Local $aN, $ihex = 0
    $aN = StringSplit(StringTrimLeft($iN, 2), "", 1)
    For $x = 1 To UBound($aN) - 1
    $ihex += Dec($aN[$x]) * (16 ^ (UBound($aN) - 1 - $x))
    Next
    MsgBox(0, "dec out:", $ihex)
    Return $ihex
    EndFunc ;==>Hex2Dec

    [/autoit]
  • Hi,
    irgendwie verstehe ich nicht was du machen willst.
    Wieso benutzt du nicht einfach nur Dec?

    Außerdem hast du doch "Hex in" und "Dec out"? Oder ich verstehe dich gerade komplett falsch.

  • So ein ähnliches Problem hatte ich auch schonmal.
    Damals lag es an der Art wie die Daten gespeichert werden (Endianness) und an der automatischen Umwandlung von Int in Double bei AutoIt.

    [autoit]

    Hex2Dec(0x123456)

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

    Func Hex2Dec($iN)
    ConsoleWrite('dec in: ' & $iN & @CRLF)
    ConsoleWrite('hex in: ' & Hex($iN,8) & @CRLF)
    Local $aN, $ihex = 0
    $aN = StringSplit(StringTrimLeft($iN, 2), "", 1)
    For $x = 1 To UBound($aN) - 1
    $ihex += Dec($aN[$x]) * (16 ^ (UBound($aN) - 1 - $x))
    Next
    ConsoleWrite('dec out: ' & $ihex & @CRLF)
    ConsoleWrite('Typ: ' & VarGetType($ihex) & @CRLF)
    ConsoleWrite('hex out: ' & Hex($ihex,8) & @CRLF)
    ConsoleWrite('hex out: ' & Hex(Int($ihex),8) & @CRLF)
    Return $ihex
    EndFunc ;==>Hex2Dec

    [/autoit]
  • Ich schließe mich anno2008 an und verstehe ebenfalls dein Grundproblem nicht.
    Du hast eine Funktion gepostet welche Hex2Dec heißt.
    Also eine Funktion welche dem Namen nach eine Hexzahl in eine Dezimalzahl umwandeln soll.
    Der übergebene Parameter $in wird allerdings als "dec in" bezeichnet - also wohl doch eine Dezimalzahl.
    Sehr verwirrend. Vor allem da AutoIt ja mit Hex() und Dec() schon eingebaute Funktionen existieren welche genau diese Aufgabe bewältigen sollen.
    Richtig rechnen bei mir übrigens beide:

    [autoit]

    Global Const $d_Number = 30086629
    Global $h_HexNumber = Hex($d_Number)
    Global $d_Rueck = Dec($h_HexNumber)
    ConsoleWrite(StringFormat("Ausgangzahl Dezimal:\t%10d\nHex-Zahl:\t\t%10s\nRückumwandlung:\t\t%10d\n\n", $d_Number, $h_HexNumber, $d_Rueck))

    [/autoit]

    Also sag einfach was du wirklich konkret machen willst.
    Was ist die tatsächliche Aufgabe der Funktion?
    Was für Werte werden übergeben?
    Wo kommen diese Werte her?
    Was funktioniert konkret nicht und woran erkennst du das es nicht funktioniert?
    Was wäre stattdessen der gewünschte Effekt?

  • die aufgabe der funktion ist, dezimalzahlen in hexwerte zu wandeln.
    ich habe diese funktion benutzt (so weit ich mich erinnere) weil hex()/dec()
    bei großen dezimalzahlen versagten ... damit meine ich insbesondere 64 bit große
    integer werte.

    EDIT:

    oh sorry, ich habe die falsche funktion gepostet, hier die richtige:

    [autoit]

    Func Dec2Hex($iN)
    MsgBox(0, "dec2hex in:", $iN)
    Local $ihex = ""
    Do
    $ihex = Hex(Mod($iN, 16), 1) & $ihex
    $iN = Floor($iN / 16)
    ;ConsoleWrite($iN & " " & $ihex & @CRLF)
    Until $iN = 0
    Return $ihex
    MsgBox(0, "dec2hex out:", $ihex)
    EndFunc ;==>Dec2Hex

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

    edit2:

    um es nochmal klar zu stellen:
    die funktionen sollten in der lage sein dezimalzahlen in hex zu wandeln
    das ganze sollte unter 64bit auch funktionieren d.h. wenn ich also folgende dezimalzahl habe
    "8608480567731124087" sollte da als hex: "7777777777777777" rauskommen. (und umgekerht)
    da ich ausschließlich mit positiven zahlen rechne (ich mochte speicheradressen zusammenrechnen),
    sollten auch nur positive zahlen rauskommen, dh. unsigned int´s ....

    2 Mal editiert, zuletzt von WhiteLion (21. November 2012 um 17:04)

  • Die Funktionen aus der Binary UDF sind da vermutlich ein wenig schneller (teilweise Inline-Assembler).
    Hier mal ein Beispiel mit Umwandlung nach Hex und wieder zurück (mit AutoIt-Int):

    Spoiler anzeigen
    [autoit]

    #include <Binary.au3>

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

    $iDec = 8608480567731124087
    $iHex = "0x" & _Hex64($iDec)

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

    ConsoleWrite("Hex:" & @TAB & $iHex & @CRLF & "Dec:" & @TAB & Int($iHex, 2) & @CRLF)

    [/autoit]