Seltsames Verhalten von Hex und Int

  • Moin,

    Das Testskript ist extrem klein (ausnahmsweise^^) und das Problem extrem simpel.

    Funktion:
    Es wird die Hexadezimaldarstellung von "Hallo" erzeugt und ausgegeben.
    Anschließend wird die Hexadezimalzahl ins 10er system umgerechnet und angezeigt.
    Wenn ich die Hexzahl aber kopiere und anzeigen lasse kommt etwas anderes raus.
    Das ergibt für mich keinen Sinn^^
    (Es ist spät. Hoffentlich bin ich einfach nur müde)

    Es funktioniert mit beliebigen Strings die in eine 64Bit Variable passen. (z.B. "bla")

    [autoit]

    Local $iHex = StringToBinary('Hallo')

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

    Debug($iHex)
    Debug(Int($iHex))
    Debug(Int('0x48616C6C6F'))

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

    Func Debug($s)
    ConsoleWrite($s & @CRLF)
    EndFunc

    [/autoit]
  • So gehts.

    [autoit]

    Local $bHex = StringToBinary('Hallo')

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

    Debug($bHex)
    Debug(Int(String($bHex)))
    Debug(Int('0x48616C6C6F'))

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

    Func Debug($s)
    ConsoleWrite($s & @CRLF)
    EndFunc

    [/autoit]


    Es heißt übriegens nicht $iHex, da es ja ein Binär ist.

  • Dass es mittels Cast zum String funktioniert habe ich inzwischen auch herausgefunden.
    Aber woher kommt die andere Zahl ?

    Das interessante ist.
    Input ist "Hallo"

    Die die "binary" oder was auch immer das ist lautet 48616C6C6F (Prinzipiell eine 10Stellige Hex Zahl)
    Direkt (ohne zum String zu wandeln) ergibt das als Int 478560411976 (Dezimalzahl)
    Wenn man diese nun zurück ins Hex Format bringt kommt das dabei raus: 6F6C6C6148 (10 Stellige Hex Zahl)

    Diese Zahlen haben eine Verbindung.
    48 61 6C 6C 6F
    6F 6C 6C 61 48
    Die erste ist die 2te Rückwärts in 2er Schritten (1ASC)

    Wieso kommt ohne String Casting (was den Fehler zwar behebt, aber Warum ?!. Ob ich 0x48616C6C6F (Bin) oder 0x48616C6C6F (Str) reinstecke. Es bleibt doch das gleiche ?) das Rückwärtige heraus ?

    [autoit]

    Debug(Binary('0x48616C6C6F') & ' -> ' & Int(Binary('0x48616C6C6F')) & ' -> ' & Hex(Int(Binary('0x48616C6C6F')),10))
    Debug('0x48616C6C6F' & ' -> ' & Int('0x48616C6C6F') & ' -> ' & Hex(Int('0x48616C6C6F'),10))

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

    Func Debug($s)
    ConsoleWrite($s & @CRLF)
    EndFunc

    [/autoit]
  • Hi,

    Zitat

    Diese Zahlen haben eine Verbindung.
    48 61 6C 6C 6F
    6F 6C 6C 61 48
    Die erste ist die 2te Rückwärts in 2er Schritten

    sieht mir sehr nach einem Speicherfeature aus^^
    Du beachtest aber Little/Big Endian nicht....

    Die "Zahl" (als INT) in den Speicher wird natürlich in Little Endian geschrieben, steht also im Speicher "rückwärts" drin.
    Der "String" liest byteweise aus, holt sich diese Bytes also "rückwärts" und kommt damit zum "falschen" Ergebnis (als String gesehen)
    Wird jetzt aber dieser String wieder in die Zahl umgewandelt, dann greift Little Endian und die Zahl ist wieder richtig.

    Mach das alles mal mit einer DllStruct() , also verschiedene Typen im gleichen Speicherbereich, und schau dir da die Ergebnisse an....

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    $struct_string=dllstructcreate("char[8]");64 Bit
    dllstructsetdata($struct_string,1,"Hallo");nacheinander in den Speicher schreiben, also gewissermassen Big Endian

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

    for $i=0 to 4;einzelne Buchstaben aus dem Speicher holen
    $struct_byte=dllstructcreate("byte",DllStructGetPtr($struct_string)+$i);holt sich die Bytes nacheinander aus dem Speicher
    $byte=DllStructGetData($struct_byte,1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $byte = ' & $byte &" "& chr($byte)&" "&hex($byte,2)& @crlf) ;### Debug Console
    next

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

    $struct_int=DllStructCreate("int64",DllStructGetPtr($struct_string));den INT aus dem Speicher holen little endian
    $int64=dllstructgetdata($struct_int,1);little endian
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $int64 = ' & $int64 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $hex=hex($int64);diesen INT als hex
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hex = ' & $hex & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    ;umgekehrt genauso...
    $struct_int=DllStructCreate("int64")
    dllstructsetdata($struct_int,1,0xAABBCCDD);little endian
    $struct_string=dllstructcreate("char[8]",DllStructGetPtr($struct_int));64 Bit
    for $i=0 to 7 ;alle bytes auslesen
    $struct_byte=dllstructcreate("byte",DllStructGetPtr($struct_string)+$i);holt sich die Bytes nacheinander aus dem Speicher
    $byte=DllStructGetData($struct_byte,1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $byte = ' & " "& $i&" "&hex($byte,2)& @crlf) ;### Debug Console

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

    next

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (4. August 2012 um 07:38)

  • Das klingt logisch.
    Darauf wäre ich auch nicht alleine gekommen. Die Begriffe haben mir zwar was gesagt, aber was damit genau gemeint ist habe ich bisher immer erfolgreich nicht beachtet. Man kommt damit ja auch relativ selten in Kontakt^^

    Danke fürs Helfen :)

  • Zu diesem Thema gab es mal einen längeren Thread, man beachte insbesondere auch Post #13 :rofl: