HEX Zahlen die per Schleife erzeugt wurden in ein Array (Variable) schreiben

  • water hat mich darauf aufmerksam gemacht, dass meine Frage für andere Nutzer eventuell interessant sein könnte.

    Deshalb hier der CHAT Auszug:

    Concara Vor 17 Stunden

    Hallo hat jemand einen tipp wie ich HEX Zahlen in ein Array schreibe die ich mit einer Schleife generiere? $aArray[1] = 0xffffffff funktioniert aber wenn man es in einer schleifen mit $aArray[$i] = "0xFF" & Hex($i, 6) erstellt nicht



    468-495cafc1807a11db28735fdb6a7a16cbe98532b2.png

    Mars Vor 15 Stunden

    Je nachdem wofür die die "hexzahlen" verwenden willst musst du eine Typumwandlung durchführen. "0xFF" & Hex($i, 6) ergibt einen String, 0xffffffff ergibt ein Integer. Ich weiß ja nicht was du machen willst. Probier mal Int('0xFF' & Hex($i, 6))



    813-726d56c5f162877ec21ceea557692e793dc23143.png

    Musashi Vor 15 Stunden

    #include <Array.au3>

    Local $aHexValues[0]

    For $i = 1 To 1024

    _ArrayAdd($aHexValues, "0xFF" & Hex($i, 6))

    Next

    _ArrayDisplay($aHexValues)



    632-05648137265b9a3f2343ddd4c0ae863a4a718193.png

    Bitnugger Vor 15 Stunden

    #include <Array.au3>

    Local $aHexValues[1025]

    For $i = 0 To 1024

    $aHexValues[$i] = Ptr($i)

    Next

    ConsoleWrite('$aHexValues[99] = ' & $aHexValues[99] & @CRLF)

    _ArrayDisplay($aHexValues)



    509-d163c19b0e98589151a292013422e68693a0cb23.jpg

    Concara Vor 15 Stunden

    Wie Mars schon geschrieben hat so wie Musashi und Bitnugger es gemacht haben. So eine ähnliche schleifen habe ich auch in Verwendung. Danke Mars für den Hinweis, dass Hexzahlen im Array Integer sind. Damit funktioniert es wunderbar.
    509-d163c19b0e98589151a292013422e68693a0cb23.jpg

    Concara Vor 15 Stunden

    $i = Dec("FFFFFF")

    Local $aArray[4][2]

    $aArray[0][0] = 0xFFFFFFFF

    $aArray[0][1] = "0xFFFFFFFF"

    $aArray[1][0] = Int('0xFF' & Hex($i, 6))

    $aArray[1][1] = '0xFF' & Hex($i, 6)

    $i = Dec("FFAAFF")

    $aArray[2][0] = 0xFFFFAAFF

    $aArray[2][1] = "0xFFFFAAFF"

    $aArray[3][0] = Int('0xFF' & Hex($i, 6))

    $aArray[3][1] = '0xFF' & Hex($i, 6)

    _ArrayDisplay($aArray)
    509-d163c19b0e98589151a292013422e68693a0cb23.jpg

    Concara Vor 15 Stunden

    ...Wie Mars schon geschrieben hat so wie Musashi und Bitnugger es gemacht haben sind es auch Strings im Array.
    632-05648137265b9a3f2343ddd4c0ae863a4a718193.png

    Bitnugger Vor 12 Stunden

    Ein Ptr ist definitiv kein String... und was wie mit _ArrayDisplay angezeigt wird, ist eine völlig andere Sache.



    813-726d56c5f162877ec21ceea557692e793dc23143.png

    Musashi Vor 12 Stunden

    Concara : Prüfe einfach mal

    Local $iVal = 1024

    ConsoleWrite("VarTyp $iVal ............... = " & VarGetType($iVal) & @CRLF)

    ConsoleWrite("VarTyp Ptr($iVal) ........... = " & VarGetType(Ptr($iVal)) & @CRLF)

    ConsoleWrite("VarTyp '0xFF' & Hex($iVal, 6) = " & VarGetType("0xFF" & Hex($iVal, 6)) & @CRLF)



    509-d163c19b0e98589151a292013422e68693a0cb23.jpg

    Concara Vor 2 Stunden

    Danke euch beiden. Sorry Bitnugger das ich das mit dem Pointer übersehen habe. Laut Wiki ist das nur was für Profis und der bin ich definitiv nicht. Musashi VarGetType kannte ich noch nicht, ich hoffe ich merke es mir für die Zukunft. Wie MARS schon geschrieben hat speichert Autoit HEX Zahlen in Variabel (Arrays) als Integer somit hat der Code den er geschrieben hat Int('0xFF' & Hex($i, 6)) funktioniert.
    815-f77a182c7065f84012b6a44f74f14ca29a405c0a.jpg

    water Vor 24 Minuten

    Concara So von Ösi zu Ösi. Wenn ich mir die SB so ansehe, dann vermute ich, dass dieses Thema besser in einem eigenen Thema aufgehoben wäre. Dann hätten auch andere Benutzer zukünftig was davon. Aus der SB verschwindet die Diskussion und das erarbeitete Ergebnis sehr schnell wieder.

    If not :?: then ?( else :thumbup:

    Einmal editiert, zuletzt von Concara (14. Oktober 2021 um 11:51)

  • Das scheint eine Art Bug zu sein.
    Dec kennt noch einen flag-Parameter welcher den Datentyp angibt.
    Wenn man ihn weglässt sollte dieser automatisch auf 0 stehen ($Number_Auto) - und dort würde er schauen wieviele Stellen die Hex-Zahl hat und auf $Number_64BIT ausweichen.

    So steht es zumindest in der Hilfe.

    Stattdessen scheint er aber per Default auf $NUMBER_32BIT zu gehen und dort kommt zurecht der Fehler, da es außerhalb des Wertebereiches eines 32 Bit-Integers liegt.

    Abhilfe sollte also schaffen, explizit das flag auf Auto zu setzen:

    AutoIt
    Dec("FFFFFFFF",0)
  • Hallo AspirinJunkie!

    Dieser Fehler ist dann aber im "Consolewrite" Befehl auch vorhanden.

    Oder sehe ich das falsch?

    AutoIt
    Local $iVal = 0xFFFFFFFF
    ConsoleWrite("$iVal = 0xFFFFFFFF" & @CRLF)
    ConsoleWrite('Dec("FFFFFFFF", 0) ............... = ' & Dec("FFFFFFFF", 0) & @CRLF)
    ConsoleWrite('Dec("FFFFFFFF") ............... = ' & Dec("FFFFFFFF") & @CRLF)
    ConsoleWrite("ConsoleWrite $iVal ............... = " & $iVal & @CRLF)

    Ergibt:

    $iVal = 0xFFFFFFFF

    Dec("FFFFFFFF", 0) ............... = 4294967295

    Dec("FFFFFFFF") ............... = -1

    ConsoleWrite $iVal ............... = -1

    If not :?: then ?( else :thumbup:

  • Dieser Fehler ist dann aber im "Consolewrite" Befehl auch vorhanden. Oder sehe ich das falsch?

    ConsoleWrite gibt doch nur den Rückgabewert von Dec aus. Das ist kein Fehler.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • AutoIt
    Local $iVal = 0xFFFFFFFF
    ConsoleWrite("ConsoleWrite $iVal ............... = " & $iVal & @CRLF)

    ConsoleWrite $iVal ............... = -1

    Das mein ich.

    If not :?: then ?( else :thumbup:

  • Interesannt:

    AutoIt
    Local $iVal = 0x7fffffff
    ConsoleWrite("ConsoleWrite $iVal 0x7fffffff............... = " & $iVal & @CRLF)
    Local $iVal = 0x80000000
    ConsoleWrite("ConsoleWrite $iVal 0x80000000............... = " & $iVal & @CRLF)

    ConsoleWrite $iVal 0x7fffffff............... = 2147483647

    ConsoleWrite $iVal 0x80000000............... = -2147483648

    If not :?: then ?( else :thumbup:

  • Japp, das ist der negative Bereich:

    0xFFFFFFF = -1 und geht bis 0x80000000 (-2147483648)

    Und aus meiner Sicht kein Fehler, sondern eine Möglichkeit Zahlen im Bereich von -2147483648 bis 2147483647 darzustellen.

    Evtl. gibt es einen Schalter mit dem man den negativen Bereich raus bekommt und den vollen positiven Bereich erhält, entzieht sich aber meiner Kenntnis.

    Versuch es mal so: https://www.autoitscript.com/autoit3/docs/functions/Dec.htm

    Aber irgendwie wird da auch ab 0x80000000 gekappt.

    Hilft dir ggf. das hier: https://www.autoitscript.com/forum/topic/73…ecimal-numbers/

    2 Mal editiert, zuletzt von Moombas (14. Oktober 2021 um 14:18)

  • Die -1 ist im Grunde eigentlich gar nicht wirklich falsch.
    Bei Integerdatentypen wird oftmals das erste (bzw. letzte - je nach Sicht) Bit dafür genommen um das Vorzeichen festzulegen.

    Ein Int32, welches die Bitfolge 0xFFFFFFFF interpretiert ist also tatsächlich ganz korrekt -1

    Die höchste darstellbare Int32-Zahl wäre ergo hingen 0x7FFFFFFF.

    Eine Int64-Zahl hingegen hat ein paar Stellen mehr. Dort ist die höchste darstellbare Zahl die 0x7FFFFFFFFFFFFFFF

    Und hier sieht man auch, dass der Bereich für 0xFFFFFFFF noch im positiven Bereich liegt.
    Daher entspricht die Zahl als Int64 kodiert der 4294967295 und als Int32 der -1.


    Wie macht man nun AutoIt klar, ob man es nun mit einer Int32 oder einer Int64 zu tun haben will?
    Entweder über die expliziten Parameter von z.B. Dec() oder Number() oder man gibt einfach mehr Stellen an, als in eine Int32 passen - nämlich so:

    AutoIt
    Local $iVal = 0x0FFFFFFFF
    ConsoleWrite('Dec("0FFFFFFFF", 0) ............ = ' & Dec("0FFFFFFFF", 0) & @CRLF)
    ConsoleWrite('Dec("0FFFFFFFF") ............... = ' & Dec("0FFFFFFFF") & @CRLF)
    ConsoleWrite("ConsoleWrite $iVal ............. = " & $iVal & @CRLF)
  • Also bei Dec() bekomme ich beim Testen ab 0x80000000 immer "0" zurück, egal ob 0, 1 oder 2 als Parameter, egal ob als 32bit oder 64bit kompiliert.

    Deswegen hatte ich oben geschrieben:

    Zitat

    Aber irgendwie wird da auch ab 0x80000000 gekappt.

    Edit: ok, man muss dort scheinbar unbedingt das 0x weg lassen, dann funktionierts.