Base32 - Finde den Fehler nicht

  • Hallo!

    Ich suche eine Möglichkeit, einen Base32 (für 2FA) zu erstellen. Ich habe auch etwas gefunden (https://www.autoitscript.com/forum/topic/59…2-encode-decode). Nur wirft die Exe einen Fehler aus ("Eine Variable ist nicht deklariert"). Nur finde ich den Fehler nicht, da der Script-Editor keinen Scriptfehler findet. Gibt es noch eine Möglichkeit, einen Scriptfehler zu finden? Oder wie kann ich noch Beispiel finden? Das Meiste was ich finde ist Base64. Danke!


    Gruß, René

  • Was mir direkt auffällt ist :

    (Außerhalb der Funktionen auf Local)

    Local $_BASE32_DECODE_TABLE[128]

    Local $BASE32_INIT = 0

    Wenn du eine Variable in mehreren Funktionen verwenden möchtest, ohne sie als Parameter zu übergeben, musst du sie als globale Variable deklarieren.
    Das bedeutet, dass du die Variable außerhalb aller Funktionen deklarieren und dann mit dem Schlüsselwort "Global" kennzeichnen musst.
    Dadurch wird die Variable für alle Funktionen im Skript zugänglich.


    Wenn du eine Variable nur in einer Funktion verwenden möchtest, kannst du sie als lokale Variable deklarieren, indem du das Schlüsselwort "Local" verwendest.
    In diesem Fall ist die Variable nur in der Funktion gültig, in der sie deklariert wurde, und kann nicht von anderen Funktionen im Skript verwendet werden.
    Es ist wichtig zu beachten, dass lokale Variablen und globale Variablen unterschiedliche Bereiche haben und sie unterschiedliche Werte haben können, selbst wenn sie denselben Namen haben.
    Wenn du jedoch eine globale Variable änderst, wird sich der Wert der globalen Variable überall im Skript ändern, wo sie verwendet wird.

    Um eine globale Variable in eine Funktion einzuführen, kannst du das Schlüsselwort "ByRef" verwenden.
    Dadurch wird die Variable als Referenz übergeben, sodass Änderungen an der Variable innerhalb der Funktion den Wert der globalen Variable ändern.

    Ich bin kein Profi aber du programmierst noch mehr sprachen oder ?:D du hast immer sehr gute Ansätze für autoit Anfänger. ;)

  • du hast immer sehr gute Ansätze

    Auch nur aus dem Internet.


    aber du programmierst noch mehr sprachen oder

    Nur in VBA. In AutoIt bin ich Laie. Aber ich habe, durch jahrelange Erfahrungen in VBA, ein Codeverständis entwickelt, auch für andere Sprachen (AutoIt, HTML, PHP, Javascript, CSS3).

  • Oke also nur VBA find ich aber gut :).

    Ich mach bisher nur etwas autoit.

    Wenn du sagt du hast die Ansätze nur aus dem Internet dann gebe ich dir nun noch 3 kleine Beispiele zu den oben genannten 3 Szenarien zu den Variablen, dann kannst du es vielleicht besser verstehen und so Umschreiben wie du es benötigst :


    AutoIt
    ;Wenn du eine Variable nur in einer Funktion verwenden möchtest, kannst du sie als lokale Variable deklarieren, indem du das Schlüsselwort 
    ;"Local" verwendest.
    ;In diesem Fall ist die Variable nur in der Funktion gültig, in der sie deklariert wurde, und kann nicht von anderen Funktionen im Skript verwendet werden.
    ;Szenario 2 :
    Func Funktion()
        Local $localVar = "Hallo Welt!"
        MsgBox(0, "", $localVar)
    EndFunc
    
    Funktion()

    Die Beispiel sind in getrennten zueinander zu behandeln, da hier ja die vars und Funktionsnamen die gleichen sind.

  • Wenn du eine Variable in mehreren Funktionen verwenden möchtest, ohne sie als Parameter zu übergeben, musst du sie als globale Variable deklarieren.
    Das bedeutet, dass du die Variable außerhalb aller Funktionen deklarieren und dann mit dem Schlüsselwort "Global" kennzeichnen musst. Dadurch wird die Variable für alle Funktionen im Skript zugänglich.

    Nur eine kleine Anmerkung :

    Genau genommen liegt jede außerhalb von Funktionen deklarierte Variable im globalen Gültigkeitsbereich (Scope), selbst wenn das Schlüsselwort Local verwendet wird.

    Umgekehrt sollte man Deklarationen mittels Global innerhalb von Funktionen aber tunlichst vermeiden.

    Ich setze bei globalen Variablennamen, wie häufig empfohlen, das Präfix  g_ , also z.B. :

    Global $g_VarName

    Das hat zwar keinen funktionalen Einfluss, erleichtert einem aber die Zuordnung.

    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."

  • Ich suche eine Möglichkeit, einen Base32 (für 2FA) zu erstellen. Ich habe auch etwas gefunden (https://www.autoitscript.com/forum/topic/59…2-encode-decode). Nur wirft die Exe einen Fehler aus ("Eine Variable ist nicht deklariert").

    Benötigst Du wirklich eine CUI und .exe mit Übergabe von Kommandozeilenparametern usw. ?

    Falls Du 'nur' Base32_Encode und Base32_Decode innerhalb deines Skriptes benötigst, dann langt es völlig aus, die UDF base32.au3 zu inkludieren (siehe Anhang). Ich habe darin lediglich einen Fehler bereinigt.

    Beispielskript base32example.au3 - siehe Anhang (die UDF base32.au3 im SkriptDir ablegen) :

    Hier noch mal das Beispielskript als Code :

  • Moin,

    wenn ich Dein Skript unkompiliert laufen lasse, bekomme ich folgenden Fehler:

    Code
    "D:\AutoIt_Neu\Base32\test32base.au3" (192) : ==> Variable used without being declared.:
    For $i = 0 to UBound($_BASE32_DECODE_TABLE)-1
    For $i = 0 to UBound(^ ERROR

    Wenn das auch Dein Fehler ist, liegt es wahrscheinlich daran, dass Du die Zeilen

    Code
    Const $BASE32CHARS ="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    Local $_BASE32_DECODE_TABLE[128]
    Local $BASE32_INIT = 0

    nach unten verlegt hast. Die Funktion _Base32_BuildTable() wird damit aufgerufen, bevor die Variablen irgendwo im Niemandsland zwischen den Funktionen deklariert werden. Wenn ich die Zeilen nach oben schiebe, hat sich dieses Problem hier erledigt.

    Edit: Ich ziehe die Frage zurück!

    Frage an Alle: Ist es gewollt, dass AutoIt Variablendeklarationen erst dann ausführt, wenn der Ablauf des Skripts die Deklarationszeilen erreicht?

    Einmal editiert, zuletzt von Velted (22. Juni 2023 um 11:58) aus folgendem Grund: Zweifel beseitigt!

  • wenn ich Dein Skript unkompiliert laufen lasse, bekomme ich folgenden Fehler: ...

    Du meinst sicher das Script, dass mumpel in seinem Beitrag #1 gepostet hat, oder ?

    Bei meiner bereinigten Variante aus Beitrag #6 kommt es zu keinem 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."

  • Nur eine kleine Anmerkung :

    Genau genommen liegt jede außerhalb von Funktionen deklarierte Variable im globalen Gültigkeitsbereich (Scope), selbst wenn das Schlüsselwort Local verwendet wird.

    Umgekehrt sollte man Deklarationen mittels Global innerhalb von Funktionen aber tunlichst vermeiden.

    Gut zu wissen.
    Das wusste ich nicht aber ich hatte auch immer Probleme wenn ich die vars einfach so ins Skript geschrieben habe, seit ich die Regel die ich oben so zu sagen mitgeben habe befolge hatte ich keine Probleme mehr, aber ich bin selber vielleicht auch etwas besser geworden und deswegen hab ich evtl. keine Probleme mehr damit ^^.

  • Umgekehrt sollte man Deklarationen mittels Global innerhalb von Funktionen aber tunlichst vermeiden.

    "Global" ist vergleichbar mit "Public" in VBA. Das sind beides globale Variablen, die Projektweit verfügbar sind, egal in welchem Modul sie stehen (Eine "au3" in AutoIt ist das was ein allgemeines Modul in VBA ist).

  • Jetzt ist mein Projekt fertig. http://www.rholtz-office.de/counters/getfile.php?id=914

    Zum Test die "2FA-QR-Code erstellen.exe" aufrufen.

    1. Zuerst wählt man den Pfad, in dem der QR-Code gepeichert wird.

    2. Dann gibt man den Dateinamen für den QR-Code an.

    3. Jetzt gibt man einen Code aus Zahlen und Großbuchstaben an.

    4. Mit Klick auf "Secret berechnen" wird der Code in Base32 umgewandelt.

    5. Jetzt gibt man den Herausgeber (Issuer) und einen Kontonamen an. Der Kontoname wird später im Authenticator angezeigt.

    6. Mit Klick auf "Code erstellen" wird der QR-Code generiert (PNG-Datei), den man dann im Authenticator scannt.

    Jetzt kann man auch gleich noch den Secret verschlüsseln. Dazu gibt man zuerst ein Verschlüsselungskennwort an. Mit Klick auf "Verschlüsseln" wird das Verschlüsselungskennwort gehasht (AES512), und mit diesem Hash der Secret verschlüsselt (AES256). Zusätzlich wird auch gleich der passende Quellcode in die Zwischenablage geschrieben, den man dann in sein Projekt übernehmen kann.

    Das Testprojekt enthält auch einen Test für das Einmalkennwort. Hierfür könnt ihr den QR-Code im Authenticator scannen und in "TOTP_Test2.exe" testen (Um gut zu testen, auch mal falsche Codes eingeben). Der Quellcode dafür ist enthalten.

    Sollten bei euch Fehlermeldungen angezeigt werden, dann bitte hier reinschreiben.

  • Glückwunsch zur Fertigstellung Deines Projektes :) .

    Sollten bei euch Fehlermeldungen angezeigt werden, dann bitte hier reinschreiben.

    Vorschlag :

    Poste den Quellcode doch bitte auch hier im Thread. Dann kann sich jede(r) Interessierte die .exe-Datei(en) selbst kompilieren, ohne sie erst von Deine Website herunterladen zu müssen.

    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."

  • Poste den Quellcode doch bitte auch hier im Thread. Dann kann sich jeder Interessierte die .exe-Datei(en) selbst kompilieren, ohne sie erst von Deine Website herunterladen zu müssen.

    Auch keine schlechte Idee (Obwohl ich auf meiner HP die Download-Zahlen besser unter Kontrolle habe. 😉 ). Vielleicht kann ja jemand nicht mehr benötigte Dinge aus den Dateien entfernen, so dass es hinterher trotzdem noch läuft. Derzeit habe ich nicht mehr benötigte Dinge über den Rand hinaus verschoben, da ich feste Werte möchte.

  • mumpel 23. Juni 2023 um 10:43

    Hat das Label [ gelöst ] hinzugefügt.