Buchstaben eilnzeln auslesen.

  • Ich möchte aus einer Hex.Variable (Hex wie z.b. 00FF23) die einzelnen zahlen gertennt ausleden. Nun weiß ich nicht wie ich das anstellen kann. Ich hatte mir etwas vorgestellt wie:

    [autoit]

    global $hexvar = 00FF23
    $buchst1 = $hexvar[2]

    [/autoit]


    natürlich funktioniert es auf diesem weg nicht also wollte ich fragen ob ihr wisst wie soetwas zu realisieren ist.

    LG oernikarl

  • [autoit]

    Global $hexvar = 0x00FF23
    Global $s_Hex = Hex($hexvar, 6) ; Hex-Zahl als String mit der Länge 6

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

    For $i in StringSplit($s_Hex,"", 2) ; String zeichenweise in ein Array und durchgehen
    MsgBox(0,"", $i)
    Next

    [/autoit]
  • Oder "professioneller" direkt mit StringRegExp :P...
    StringSplit und so arbeiten ja auch damit ;D...

    [autoit]

    #include <Array.au3>
    #include <String.au3>

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

    Global $hexvar = "00FF23"

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

    $aReturn = _GetHexSingleCharacters($hexvar)

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

    _ArrayDisplay($aReturn)
    MsgBox(4096, "Ergebnis", $aReturn[2])
    $aReturn[1] = "6"
    _ArrayDisplay($aReturn)

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

    Func _GetHexSingleCharacters($sString)
    Return StringRegExp($sString, '(.)', 3)
    EndFunc

    [/autoit]


    LG,
    Aca

    2 Mal editiert, zuletzt von Acanis (18. August 2012 um 15:54)

  • StringSplit und so arbeiten ja auch damit ;D...


    Kannst du das vielleicht etwas näher erläutern - habe das nicht genau verstanden.

    Ansonsten sehe ich für StringRegEx im Vergleich zur StringSplit-Lösung für diesen Fall nur Nachteile und keinen einzigen Vorteil.

  • Solche Fragen kann man sich auch selber beantworten... Mal in die String.au3 geguckt?^^

    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _StringBetween
    ; Description ...: Returns the string between the start search string and the end search string.
    ; Syntax.........: _StringBetween($s_String, $s_start, $s_end[, $v_Case = -1])
    ; Parameters ....: $s_String - The string to search.
    ; $s_start - The beginning of the string to find. Passing a blank string starts at the beginning
    ; $s_end - The end of the string to find. Passing a blank string searches from $s_start to end
    ; $v_Case - Optional: Case sensitive search. Default or -1 is not Case sensitive else Case sensitive.
    ; Return values .: Success - A 0 based $array[0] contains the first found string.
    ; Failure - 0
    ; |@Error - 1 = No inbetween string found.
    ; Author ........: SmOke_N (Thanks to Valik for helping with the new StringRegExp (?s)(?i) isssue)
    ; Modified.......: SmOke_N - (Re-write for speed and accuracy)
    ; Remarks .......: 2009/05/03 Script breaking change, removed 5th parameter
    ; Related .......:
    ; Link ..........:
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _StringBetween($s_String, $s_Start, $s_End, $v_Case = -1)

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

    ; Set case type
    Local $s_case = ""
    If $v_Case = Default Or $v_Case = -1 Then $s_case = "(?i)"

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

    ; Escape characters
    Local $s_pattern_escape = "(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)"
    $s_Start = StringRegExpReplace($s_Start, $s_pattern_escape, "\\$1")
    $s_End = StringRegExpReplace($s_End, $s_pattern_escape, "\\$1")

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

    ; If you want data from beginning then replace blank start with beginning of string
    If $s_Start = "" Then $s_Start = "\A"

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

    ; If you want data from a start to an end then replace blank with end of string
    If $s_End = "" Then $s_End = "\z"

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

    Local $a_ret = StringRegExp($s_String, "(?s)" & $s_case & $s_Start & "(.*?)" & $s_End, 3)

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

    If @error Then Return SetError(1, 0, 0)
    Return $a_ret
    EndFunc ;==>_StringBetween

    [/autoit]


    Die String-Funktionen sind alle mit StringRegExp realisiert, wie auch sonst O.o...
    Welche Nachteile siehst du da bitte? Du arbeitest eh indirekt damit... Und direkter Zugriff ist immer schöner...^^

    Die String-Funktionen machen es Anfängern einfacher, weil man sich mit den komplexen Pattern nicht auseinander setzen muss... Aber ist immer sauberer, sich selber sowas zu schreiben, auf sein Problem angepasst!

    Einziges "Problem" könnte sein, dass, wenn er einen leeren String übergibt, es abstürzt... Wenn das passieren KANN, fängt man das halt noch mit nem ISArray in der Funktion ab....

    *Edit*
    Du hast StringSplit genutzt, net Between, seh ich grad :D... Aber bin am Zocken und kann grad net schreiben :P... Müsste aber genauso funken ;D...

    Einmal editiert, zuletzt von Acanis (18. August 2012 um 17:22)

  • Solche Fragen kann man sich auch selber beantworten... Mal in die String.au3 geguckt?

    Die StringSplit ist keine UDF sondern natives AutoIt.
    Die StringBetween-Funktion hat nichts mit der hier behandelten StringSplit-Funktion zu tun.

    Die String-Funktionen sind alle mit StringRegExp realisiert, wie auch sonst O.o...

    Das ist falsch.

    Welche Nachteile siehst du da bitte?

    Konkret: Die Variante mit StringRegExp ist weniger performant als die StringSplit-Version und für einen Anfänger ist StringSplit einfacher und intuitiver.

  • RegExp ist eine elegante Methode, aber nicht immer die Beste. Wenn man etwas mit einer anderen Funktion in der gleichen Anzahl von Schritten lösen kann, sollte man das auch tun, weil bei RegExp nicht auf den ersten Blick verständlich ist, was und warum es da gemacht wird. Desweiteren arbeiten andere Befehle oft schneller, weil da kein RegExp-parser laufen muss.

  • *Edit* Ach, mir auch egal, nu *Rolleyes*

    Einmal editiert, zuletzt von Acanis (18. August 2012 um 17:32)

  • Da hast du gleich 2 Fehler gemacht...
    1. Die MessageBox, die das Ergebnis anzeigt, beeiflusst das Ergebnis.
    2. Du vergisst den Timer zurückzusetzen

    Wenn man die beiden Punkte korrigiert sieht man, dass StringSplit schneller ist.

  • Dein Skript ist Schwachsinn.
    1. Du setzt den Timer nicht neu. Beim Test der zweiten Funktion wird die Zeit für den ersten aufruf mitgezählt.
    2. Du berechnest die Zeitdifferenz erst nach der ersten MessageBox. Die Zeit, bis man auf OK klickt wird also mitgezählt. Ich komme bei Testsmit einem korregierten Skript auf eine Zeit von 225 zu 145. Die StringSplit-methode ist also deutlich performanter.

    EDIT: Zu spät. ;(

  • Das ist total QUARK... Weniger performant? Vllt. testest du das erstmal, bevor du sowas in den Raum stellst...

    Keine Sorge das habe ich natürlich getan.
    Sonst würde ich sowas tatsächlich nicht in den Raum stellen:

    Performance-Vergleich-Skript
    [autoit]

    Global Const $String = "00FF23"
    Global Const $N = 10000

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

    $iT = TimerInit()
    For $i = 1 To $N
    $a_T = StringSplit($String,"", 2)
    Next
    $iT = TimerDiff($iT) / $N
    ConsoleWrite(StringFormat("StringSplit:\t %6.4fms\n", $iT))

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

    $iT = TimerInit()
    For $i = 1 To $N
    $a_T = StringRegExp($String, '(.)', 3)
    Next
    $iT = TimerDiff($iT) / $N
    ConsoleWrite(StringFormat("StringRegExp:\t %6.4fms\n", $iT))

    [/autoit]

    Hier mal ein schnelles (quick & dirty) Testscript, dass zeigt, dass StringRegExp 3x(!!!) so schnell ist..

    Ja - vor allem "dirty".
    Zwischen dem TimerInit und dem TimerDiff liegen msgboxen welche dazu führen das deren Anzeigedauer mit in die Zeitmessung einfließen.
    Wenn man dann noch nur ein einziges TimerInit macht so dass auf die StringSplit-Zeit noch die Zeit der StringRegExp-Methode und die Dauer der 3 Msgboxen einfließen dann wird klar warum die StringSplit-Variante nie auf kürzere Zeiten kommen kann als die StringRegExp-Variante.

    Edit: Schade dass du das Skript nachträglich gelöscht hast.
    So sind die nachfolgenden Beiträge nicht mehr nachvollziehbar.

    • Offizieller Beitrag

    @Arcanis

    Wenn ich das Beispiel schon sehe, geht mir der Hut hoch. Äpfel mit Birnen vergleichen.

    [autoit]

    Global $hexvar = "00FF23"
    Global $hexvar2 = 0x00FF23

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

    $timer = TimerInit()
    For $i = 0 To 9999
    $aReturn = _GetHexSingleCharacter($hexvar)
    Next
    For $i = 0 To 9999
    $aReturn = _GetHexSingleCharacter($hexvar2)
    Next
    ConsoleWrite("StringRegExp :"&TimerDiff($timer) & @CRLF)
    $timer = TimerInit()

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

    For $i = 0 To 9999
    $aReturn = _GetHexSingleCharacter2($hexvar)
    Next
    For $i = 0 To 9999
    $aReturn = _GetHexSingleCharacter2($hexvar2)
    Next
    ConsoleWrite("StringSplit :"&TimerDiff($timer) & @CRLF)

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

    Func _GetHexSingleCharacter($sString)
    $s_Hex = Hex($sString, 6)
    Return StringRegExp($s_Hex, '(.)', 3)
    EndFunc

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

    Func _GetHexSingleCharacter2($sString)
    $s_Hex = Hex($sString, 6)
    Return StringSplit($s_Hex,"", 2)
    EndFunc

    [/autoit]


    StringSplit ist fast doppelt so schnell.

    Na Toll, jetzt ist der Schwachsinn wegeditiert.

    Shit zu langsam.

  • Äpfel, mit Birnen vergleichen??? Sonst gehts gut?

    Wenn du mal die Augen auf gemacht hättest, habe ich sofort editiert, habe im Ladebildschirm kurz was geproggt und hatte n Fehler drin, yo O.o So what?
    Ich habe "Hex()" noch im Nachhinein reingezogen und von 3* auf 2* korrigiert O.o...

    Und vor dir wurde ich schon korrigiert! Wer es nicht mal schafft, eine Namen richtig ABZUSCHREIBEN, sollte mal lieber die Füße still halten!


    Und bei 1000x der Funktion macht es EINE Sekunde Unterschied... Ist natürlich so ein unglaublicher Unterschied :D!

  • Bitte bleibe doch in deiner Wortwahl etwas höflicher.
    Du hast in deinen bisherigen Posts hier sehr viele Fehler und Falschaussagen drinnen.
    Auf diese wurdest du jeweils hingewiesen und reagierst dann direkt aggressiv anstatt dich mit dem Inhalt der Kritik auseinander zu setzen - warum?

  • Bitte bleibe doch in deiner Wortwahl etwas höflicher.
    Du hast in deinen bisherigen Posts hier sehr viele Fehler und Falschaussagen drinnen.
    Auf diese wurdest du jeweils hingewiesen und reagierst dann direkt aggressiv anstatt dich mit dem Inhalt der Kritik auseinander zu setzen - warum?

    Meine Wortwahl ist nicht unhöflich... lol

    Deine Kritik war berechtigt und in Ordnung und habe mich so kurz angebunden etwas vertan ;)! Sorry... :D
    Trotzdem ist mein Script hilfreich und richtig und bei dem Unterschied in Performancesachen tut sich das nichts.

    Nur dieser extrem (ich will nicht ausfallen werden) Post von Raupi regt mich auf O.o... Es wurde bereits von euch korrigiert, LANGE bevor er gepostet hat, habe ich meinen Beitrag bereits editiert und er kommt mir so dumm an und schafft es nicht mal, meinen Namen, was ein Grundschulkind könnte, richtig zu schreiben O.o... Aber tut hier auf "Macker", weil er was korrigiert hat, was schon JEDEM vor ihm aufgefallen ist xD...

  • @Acanis
    Beschwere dich nicht über anderer Leute Orthografie, sondern achte auf deine eigene, besonders was Grammatik und Satzzeichen angeht.
    Anderweitig solltest du wissen, dass es hin und wieder vorkommt, das man einen Beitrag etwas verspätet absenden, sodass das "Gespräch" schon ein bisschen weiter ist. Was man unschwer hieran erkennen kann:

    Zitat von Raupi


    Shit zu langsam.


    Also pass du bitte auf, was du sagst.

    So, genug Offtopic, würde ich sagen.
    An den Threadersteller: Dein Problem ist ja offenbar gelöst, also setze bitte das Themenpräfix durch Editieren deines ersten Posts in diesem Thread auf "gelöst".

    lg chess

    • Offizieller Beitrag

    @Acanis

    Ich gebs zu, es juckt mir in den Fingern, dir eine Verwarnung reinzudrücken. Aber ich nehme im Moment nochmal davon Abstand.
    Umgangsformen sind uns schon wichtig. Und wie man an deinem Bsp. sieht trifft der Spruch zu: Getroffene Hunde bellen.
    Also nimm ein bischen die Luft raus und überlege, ob vielleicht auch jemand anders als du hier richtig liegt.

    Ich betrachte das Thema als erledigt.

    [CLOSED]