Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Zahlensystem-Konverter


  • Please log in to reply
14 replies to this topic
Dr_Holle
  • Members
  • 105 posts
  • Last active: Mar 26 2014 10:10 AM
  • Joined: 18 Dec 2012

Im "alten Forum" hatte ich mal einen Zahlensystem-Konverter veröffentlicht. Da hier auch gerade jemand einen Konverter schreibt wollte ich diesen verlinken, damit man Teile daraus nutzen kann.

Leider klappt das Verlinken von Beiträgen aus dem "alten Forum" nicht, deshalb erstelle ich den Thread hierb noch einmal erneut...

 

Manchmal kommt es vor dass man "ganz exotische Zahlensysteme" benötigt. Wer von euch Geocaching betreibt wird sicher schon mal das eine oder andere Zahlensystem-Problem zu meistern gehabt haben.

Der folgende Konverter wandelt alle denkbaren Zahlensysteme um. Wenn man z.B. eine Ini-Datei "verschlüsseln" will würde sich die Berechnung "krummer Zahlensystem" eignen (das wäre nicht sonderlich sicher, schützt aber davor dass diese einfach gelesen und geändert werden kann.

 

Es gibt jedoch ein kleines Problem:
Beispiel:
Wenn man das 60´er System benötigt (ja, so etwas gibt es wirklich. Zum Beispiel haben die Babyloner mit der Keilschrift das 60´er System verwendet wink.png ), dann reichen natürlich unsere Zahlen nicht aus.

Gut, beim Hexadezimalen System werden dann Buchstaben verwendet, aber da wir mit 10 Zahlen und 26 Buchstaben lediglich 36 Zeichen zur Verfügung haben reicht es dennoch nicht aus.

Um dennoch jedes Zahlensystem zu ermöglichen habe ich das so gelöst, dass man den Wert der Zeichen in runden Klammern angeben kann.
Hexadezimal 5FA12 kann mal also auch so eingeben: 5(15)(10)12
Somit stehen unbegrenzte Zeichen zur Verfügung wodurch alle Zahlensysteme umgerechnet werden können.

 

Nun könnte das jemand in einem Script gebrauchen (z.B. um Hex in Dez umzurechnen) indem er es in als Funktion aufruft und andere möchten lieber eine GUI-Oberfläche.
Ich habe das Script deshalb so gecodet dass man eine GUI hat, aber es auch ohne GUI (als Funktion) verwenden kann.

 

OK, kommen wir zu den Screenshots * :

* Ich war zu faul neue Screenshots zu machen, aber der große Text "Zahlensystem-Wandler" wurde auf Wunsch entfernt, da der Fenstername diese Information bereits enhält.

 

Verwendung per GUI:

convert_gui.jpg

 

 

Verwendung im Script:

convert_code.jpg

 

 

Die Bedienung:
Wenn man die GUI verwendet kann man die gängigen Zahlensysteme per DropDown-Liste auswählen. Alternativ kann man es auch direkt eintragen. Für "krumme" Zahlensysteme (z.B. 41´er System) gibt man das in Form von "BaseZahl" ein, also "Base41" für das 41´er System
Es werden Zahlen und die Buchstaben von A-Z akzeptiert. Alternativ kann man den Wert auch in runden Klammern setzen (ist bei Zahlensystemen > 35 ein "muss", da nicht genügend Buchstaben zur Verfügung stehen).
Hat man nun also die 2 Zahlensysteme ausgewählt ("von" und "nach") gibt man noch den zu wandelnden Wert ein und Klickt auf "Convert".
Das Eingabefeld, in dem man gerade die Eingabe gemacht hat wird automatisch als "von" zugewiesen. Im Convert-Button erscheint dann auch ein Pfeil, der die Richtung anzeigt in der Konvertiert wird.
Das Konvertieren ist in beiden Richtungen möglich.

 

 

 

Wenn man es in einem Script benötigt:

Var := Convert("Wert", "Von", "Zu")

 

 

Beispiel:
Man möchte eine Variable mit binärem Inhalt ins hexadezimale Konvertieren...

var_bin := "010011001"
var_hex := Convert(var_bin, bin, hex)

 

 

Die Namen der zugeordneten Zahlensysteme kann man dem Script entnehmen (oder diese erweitern). Ansonsten ist es immer möglich "BaseN" einzugeben, wobei "N" für die Zahl steht.
Beispiel: Base10 für das Dezimalsystem (0-9), Base2 für das Binärsystem (0-1), usw.

 

 

OK, kommen wir zum Script...

; Link: http://creativecommons.org/licenses/by/3.0/
; Lizenz: Creative Commons Attribution 3.0 Unported
Gui +AlwaysOnTop
Gui, Add, ComboBox, x10 y10 w150 h20 r5 vChoose1 Choose9, Binär (2)|Trial (3)|Tetral (4)|Pental (5)|Hexal (6)|Peptal (7)|Oktal (8)|Nonal (9)|Dezimal (10)|Monadezimal (11)|Dedezimal (12)|Tridezimal (13)|Tetradezimal (14)|Pentadezimal (15)|Hexadezimal (16)|Peptaldezimal (17)|Oktaldezimal (18)|Nonaldezimal (19)|Vigesimal (20)|Triakontal (30)|Tettarakontal (40)|Pentekontal (50)|Sexagesimal (60)
Gui, Add, ComboBox, x270 y10 w150 h20 r5 vChoose2 Choose15, Binär (2)|Trial (3)|Tetral (4)|Pental (5)|Hexal (6)|Peptal (7)|Oktal (8)|Nonal (9)|Dezimal (10)|Monadezimal (11)|Dedezimal (12)|Tridezimal (13)|Tetradezimal (14)|Pentadezimal (15)|Hexadezimal (16)|Peptaldezimal (17)|Oktaldezimal (18)|Nonaldezimal (19)|Vigesimal (20)|Triakontal (30)|Tettarakontal (40)|Pentekontal (50)|Sexagesimal (60)
Gui, Add, Edit, x10 y40 w150 h20 vValue1,
Gui, Add, Edit, x270 y40 w150 h20 vValue2,
Gui, Font, S12 cDefault, Default
Gui, Add, Button, x165 y10 w100 h50 disabled vConvert gGO , Convert `n--------
Gui, Font, S10 cDefault, Default
Gui, Font, S7 cSilver, MsSerif
Gui, Add, Text, x340 y60 w105 h15, Created by Holle
Gui, Font, S10 cDefault, Default
OnMessage(0x201, "GUI_operate") ;linker Mausbutton
OnMessage(0x100, "GUI_operate") ;Taste gedrückt
OnMessage(0x101, "GUI_operate") ;Taste losgelassen
Gui, Show, x150 y100 h75 w430 center , Zahlensystem-Wandler
Return

;wenn dieses Fenster aktiv ist, dann betätige bei ENTER den Convert-Button
#IfWinActive, ahk_class AutoHotkeyGUI
    Enter::goto go
Return

GuiClose:
ExitApp

;Benutzung des GUI
GUI_operate()
{
    GuiControlGet, Choose1
    GuiControlGet, Choose2
    GuiControlGet, Value1
    GuiControlGet, Value2
    if (A_GuiControl = "Choose1") or (A_GuiControl = "Value1")
    {                                                                 ; wenn eines der LINKEN Felder aktiv ist...
        if (Choose1) and (Value1)
        {                                                             ; ...und die Daten eingetragen wurden, dann aktiviere den Button "nach rechts"
            GuiControl,, Convert, Convert `n------>
            GuiControl, Enable, Convert
        }
        else
        {                                                             ; ...ansonsten deaktiviere den Button
            GuiControl,, Convert, Convert `n-------
            GuiControl, Disable, Convert
        }
    }
    if (A_GuiControl = "Choose2") or (A_GuiControl = "Value2")
    {                                                                 ; wenn eines der RECHTEN Felder aktiv ist...
        if (Choose2) and (Value2)
        {                                                             ; ...und die Daten eingetragen wurden, dann aktiviere den Button "nach links"
            GuiControl,, Convert, Convert `n<------
            GuiControl, Enable, Convert
        }
        else
        {                                                             ; ...ansonsten deaktiviere den Button
            GuiControl,, Convert, Convert `n-------
            GuiControl, Disable, Convert
        }
    }
}

GO:                                                                   ; die Konvertierung per GUI starten
    GuiControlGet Convert
    GuiControlGet choose1
    GuiControlGet choose2
    if (Convert = "Convert `n<------")                                ; konvertiere von links nach rechts
    {
        GuiControlGet value2
        StringGetPos, endpos, choose1, %A_Space%                      ; entferne alles nach dem Leerzeichen
        IfNotInString, endpos, -                                      ; in den Auswahlfeldern
            StringLeft, to, choose1, %endpos%                         ; z:B. mache aus "Dezimal (10)"
        else                                                          ; einfach nur "Dezimal"
            to := choose1                                             ;           |
        StringGetPos, endpos, choose2, %A_Space%                      ;           |
        IfNotInString, endpos, -                                      ;           |
            StringLeft, from, choose2, %endpos%                       ;           |
        else                                                          ;           V
            from := choose2                                           ; ---------------------
        if (!value2) or (!choose1) or (!choose2)
            Return                                                    ; abbrechen, wenn eine Angabe fehlt
        result := convert(value2,from,to)                             ; die Konvertierungsfunktion aufrufen
        GuiControl,, Value1, %Result%                                 ; und das Ergebnis in das Edit-Feld eintragen
    }                                                                 ; ---------------------------------------------------------------------        
    else if (Convert = "Convert `n------>")                           ; das gleiche wie oben, nur von rechs nach links
    {
        GuiControlGet value1
        StringGetPos, endpos, choose2, %A_Space%
        IfNotInString, endpos, -
            StringLeft, to, choose2, %endpos%
        else
            to := choose2
        StringGetPos, endpos, choose1, %A_Space%
        IfNotInString, endpos, -
            StringLeft, from, choose1, %endpos%
        else
            from := choose1
        if (!value1) or (!choose1) or (!choose2)
            Return
        result := convert(value1,from,to)
        GuiControl,, Value2, %Result%
    }
Return

Convert(value, from, to)                                               ; Die Konvert-Funktion
{
    if !(value and from and to)                                        ; wenn Daten fehlen...
    {
        MsgBox, 4096 , , Fehlender Parameter! `n`nBenutze: Convert("Wert", "Von", "Zu") `n`nBeispiel: `nConvert("55", "dez", "hex")
        Exit
    }                                                                  ; ansonsten ....
                                                                       ; diverse Bezeichnungen der einzelnen Zahlensysteme
    base2 = Base2|Binary|Bin|Digital|Binär|Dual|Di|B
    base3 = Base3|Ternary|Triple|Trial|Ternär
    base4 = Base4|Quaternary|Quater|Tetral|Quaternär
    base5 = Base5|Quinary|Pental|Quinär
    base6 = Base6|Senary|Hexal|Senär
    base7 = Base7|Septenary|Peptal|Heptal
    base8 = Base8|Octal|Oktal|Oct|Okt|O
    base9 = Base9|Nonary|Nonal|Enneal
    base10 = Base10|Decimal|Dezimal|Denär|Dekal|Dec|Dez|D
    base11 = Base11|Undenary|Monodecimal|Monadezimal|Hendekal
    base12 = Base12|Duodecimal|Dedezimal|Dodekal
    base13 = Base13|Tridecimal|Tridezimal|Triskaidekal
    base14 = Base14|Tetradecimal|Tetradezimal|Tetrakaidekal
    base15 = Base15|Pentadecimal|Pentadezimal|Pentakaidekal
    base16 = Base16|Hexadecimal|Hexadezimal|Hektakaidekal|Hex|H
    base17 = Base17|Peptaldecimal|Peptaldezimal|Heptakaidekal
    base18 = Base18|Octaldecimal|Oktaldezimal|Octakaidekal|Oktakaidekal
    base19 = Base19|Nonarydecimal|Nonaldezimal|Enneakaidekal
    base20 = Base20|Vigesimal|Eikosal
    base30 = Base30|Triakontal
    base40 = Base40|Tettarakontal
    base50 = Base50|Pentekontal
    base60 = Base60|Sexagesimal|Hektakontal
    StringReplace, value_form, value,(,,all                            ; überprüfung ob es sich beim Wert um
    StringReplace, value_form, value_form ,),, all                     ; reine alphanumerische Zahl handelt
    if value_form is not Alnum                                         ; sofern die Klammern ignoriert werden
    {                                                                  ; und wenn nicht, dann:
        MsgBox, 4096 , , Fehler! `n`nEs werden nur alphanumerische Symbole akzeptiert!
        Exit
    }                                                                  ; ------------------------------------------------------------------------------------
    if (InStr(from, "base"))                                           ; wenn im Quell-Zahlensystem "base" vorkommt...
    {
        StringTrimLeft, base_check, from, 4                            ; ...dann schneide "base" raus um NUR die Zahl zu haben
        if base_check is not Integer                                   ; bleibt keine reine Zahl übrig, dann abbrechen
        {
            MsgBox, 4096 , , Unbekanntes Zahlensystem! `n`nBenutze Base + Zahl (z.B. Base16), `noder die Bezeichnung/Abkürzung (z.B. Hexadezimal oder Hex)
            Exit
        }
        else                                                           ; ansonsten den Inhalt der Variable "from"
            from := base_check                                         ; durch die Zahl nach "base" ersetzten
    }                                                                  ; ------------------------------------------------------------------------------------
    if (InStr(to, "base"))                                             ; das gleiche wie oben nochmal für das Ziel-Zahlensystem
    {
        StringTrimLeft, base_check, to, 4
        if base_check is not Integer
        {
            MsgBox, 4096 , , Unbekanntes Zahlensystem! `n`nBenutze Base + Zahl (z.B. Base16), `noder die Bezeichnung/Abkürzung (z.B. Hexadezimal oder Hex)
            Exit
        }
        else
            to := base_check
    }                                                                  ; ---------------------------------------------------------------------------------
    base_loop := 1
    loop, 60                                                           ; in einer Schleife von 2 bis 60 überprüfen ob im Name der
    {                                                                  ; gewählten Zahlensysteme in den Variablen "base.." vorkommt
        if from is Integer                                             ; wenn "from" nur eine Zahl ist...
            if to is Integer                                           ; und "to" auch...
                Break                                                  ; ...kann die Schleife abgebrochen werden
        if (base_loop < 20)                                            ; solange base_loop kleiner ist als 20...
            base_loop ++                                               ; ...erhöhe um 1
        else                                                           ; ansonsten...
            base_loop += 10                                            ; ...erhhe um 10
        if (base_loop > 60)                                            ; und wenn es mehr als 60 ist...
            Break                                                      ; ...dann abbrechen
        base := base%base_loop%                                        ; die base-variablen der Liste nach und nach auswählen
        loop parse, base, |                                            ; und in die einzelnen Synonyme zerlegen
        {
            if (from = A_LoopField)                                    ; ist eines der Synonyme gleich dem Namen des
                from := base_loop                                      ; Quell-Zahlensystems, dann speichere die Zahl in "from"
            if (to = A_LoopField)                                      ; ...das gleiche auch mit dem Ziel-Zahlensystem
                to := base_loop
        }
    }
    if (from < 11)                                                     ; handelt es sich um ein Zahlensystem bis 10 (also Dezimal)
        if value is not Integer                                        ; dürfen keine Buchstaben enthalten sein
        {                                                              ; wenn doch, dann abbrechen
            StringGetPos, seperator_1, base%from%, |, L1               ; Position des ersten "Teilers" von Base... für "from"
            StringGetPos, seperator_2, base%from%, |, L2               ; Position des zewiten "Teilers"...
            StringMid, name_from, base%from%, (seperator_1 + 2), (seperator_2 - seperator_1 - 1)
            StringLower, name_from, name_from, T                       ; Den Namen zwischen den ersten und zweiten Teiler merken
            MsgBox, 4096 , , Fehler! `nIm %name_from%-System werden ausschließlich Zahlen verwendet!
            Exit
        }
    con_letter := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"                         ; Erlaubte Buchstaben
    result_dec =
    length := StrLen(value)                                            ; die Anzahl der Stellen des umzuwandelnden Wertes ermitteln
    counter := 0
    parenthesis := False                                               ; bisher keine Klammer
    loop, %length%                                                     ; für jede Stelle des Wertes einen Schleifendurchlauf
    {
        StringMid, char, value, (length + 1 - A_Index), 1              ; "Rückwärtslaufend" den Wert Zeichen für Zeichen bearbeiten
        if (char = ")")                                                ; wenn man auf eine öffnende Klammer trifft...
        {                                                              ; (bedenke wir bearbeiten gerade von hinten nach vorne)
            if parenthesis                                             ; ...obwohl man sich schon in einer befindet...
            {                                                          ; ...dann abbrechen
                MsgBox, 4096 , , Fehler!`nEs werden ausschließlich einfache Klammernpaare akzeptiert!`n`nBeispiel:`n57AH6(45)(48)G2 = Akzeptiert`n57AH6((45)(48))G2 = NICHT akzeptiert!
                Exit
            }
            parenthesis := True                                        ; ansonsten merken dass man nun in einer Klammer ist
            Continue                                                   ; ...den Rest der Schleife überspringen und fortfahren
        }
        else if parenthesis                                            ; ist man gerade in einer Klammer...
        {
            if char is not Integer                                     ; und findet dort etwas anderes als eine Zahl, dann abbrechen
            {
                if (char = "(")                                        ; Wenn man auf eine schließende Klammer trifft...
                {                                                      ; (bedenke wir bearbeiten gerade von hinten nach vorne)
                    parenthesis := False                               ; Merken dass man nun NICHT mehr der Klammer ist
                    if !par_char                                       ; war die Klammer leer...
                    {                                                  ; ...dann abbrechen
                        MsgBox, 4096 , , Fehler! `nKlammerinhalt ohne Wert!
                        Exit
                    }
                    char := par_char                                   ; ansonsten alle Zahlen des Klammerinhalts als "einen" Wert zuordnen
                    par_char =                                         ; und den Inhalt von par_char löschem
                }                
                else                                                   ; Das aktuell zu prüfende Zeichen ist keine Zahl und keine "(", obwohl man sich in einer Klammer befindet,
                {                                                      ; also abbrechen
                    MsgBox, 4096 , , Fehler! `nInnerhalb von Klammern werden nur Zahlen akzeptiert!
                    Exit
                }
            }
            else                                                       ; Wir befinden uns in einer Klammer und treffen auf eine Zahl...
            {
                par_char := char . par_char                            ; alos die Zahl zusammen setzen bis die Klammer beendet wird. Da wir ja "Rückwärts" laufen,
                Continue                                               ; wird die neue Zahl nicht an die alte gehängt, sondern "davor" gesetzt.
            }
        }
        else if (char = "(")                                           ; Wenn man auf eine schließende Klammer trifft obwohl man sich nicht in einer Klammer befindet...
        {                                                              ; ...dann abbrechen
            MsgBox, 4096 , , Fehler!`nEs werden ausschließlich einfache Klammernpaare akzeptiert!`n`nBeispiel:`n57AH6(45)(48)G2 = Akzeptiert`n57AH6((45)(48))G2 = NICHT akzeptiert!
            Exit
        }
        else if char is Alpha                                          ; Man ist nicht in einer Klammer und das Zeichen ist weder "(" noch ")". Wenn man nunauf einen Buchstaben stößt...
        {
            StringGetPos, char_pos, con_letter, %char%                 ; dann prüfe an wievielter Stelle dieser in "con_letter" steht
            StringReplace, char, char, %char%, %char_pos%              ; und ersetze dann diesen Buchstaben durch die Position
            char += 10                                                 ; und addiere 10 dazu
            if (char >= from)
            {                                                          ; wenn die Zahl größer ist als das Zahlensystem
                StringGetPos, seperator_1, base%from%, |, L1           ; z.B., 18 in einem Hexadezimalsystem
                StringGetPos, seperator_2, base%from%, |, L2           ; dann breche ab
                StringMid, name_from, base%from%, (seperator_1 + 2), (seperator_2 - seperator_1 - 1)
                StringLower, name_from, name_from, T
                char := from - 10
                StringMid, char, con_letter, %char%, 1
                MsgBox, 4096 , , Fehler! `nIm %name_from%-System werden nur die Buchstaben bis "%char%" verwendet!
                Exit
            }
        }
        if (char >= from)                                              ; ist das Zeichen an der Stelle kein Buchstabe sondern eine Zahl,
        {                                                              ; welche jedoch größer ist als das Zahlensystem, dann breche ab
            max_value := from - 1
            MsgBox, 4096 , , Fehler! `nIm Base%from%-System hat eine Stelle nur den Wert von 0-%max_value%
            Exit
        }
        result_dec += char * (from**counter)                           ; ansonsten rechne das Quell-Zahlensystem in das
        counter ++                                                     ; dezimale Zahlensystem um und erhöhe den Counter um eins (nächste Stelle)
    }
    if (to = 10)                                                       ; ist das Ziel-Zahlensystem das Dezimal-System
        Return %result_dec%                                            ; dann liefere das Ergebnis zurück
    result=                                                            ; ansonsten rechne dieses in das Ziel-Zahlensystem um...
    while (result_dec)
    {       
        char := Mod(result_dec , to)                                   ; 1.Zahl des Ziel-Zahlensystems ermitteln
        if (char > 35)                                                 ; ist dieses Zeichen größer als 35,
            char := "(" . char . ")"                                   ; ...dann setze Klammern darum
        else if (char > 9)                                             ; ist es kleiner als 36 aber größer als 9,
            StringMid, char, con_letter, (char - 9), 1                 ; ...dann setze einen Buchstaben dafür ein
        result :=  char . result                                       ; setze das Ergebnis zusammen
        result_dec := Floor(result_dec / to)                           ; rechne den "rest" aus, um damit weiter zu rechnen
    }
    Return %result%                                                    ; liefere das Ergebnis zurück
}

 

Edit 09.03.2013 --> Aufgrund eines Bug-Reports von QaMarath (Fehler im Script, bei Verwendung mehrerer Klammernpaare) habe ich den Zahlen-System überarbeitet und somit diesen Bug gefixed.

Vielen Dank an QaMarath für den Bug-Report!


Edited by Dr_Holle, 09 March 2013 - 03:11 PM.


ripper121
  • Members
  • 114 posts
  • Last active: Jan 16 2014 11:06 AM
  • Joined: 01 Nov 2012

Ist eig das selbe oder ?

http://www.autohotke...orse-converter/


Ripper121 aka Ripp3r]D3[
Deutsches (original) Forum: Seit: 11.11.2007 Beiträge: 1912
ripper.gif
Top-10 German


Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012

Nein. Dieses Konverter System arbeit dynamisch mit jedem erdenklichem Zahlensystem.

In dem Thread den du gepostet hast, sind die Zahlensysteme in einzelnen Funktionen vordefiniert.

 

Dieses Script hier ist meiner Meinung nach um einiges leistungsfähiger.


Find the recent autohotkey version here: ahkscript.org


ripper121
  • Members
  • 114 posts
  • Last active: Jan 16 2014 11:06 AM
  • Joined: 01 Nov 2012

Ok danke :)


Ripper121 aka Ripp3r]D3[
Deutsches (original) Forum: Seit: 11.11.2007 Beiträge: 1912
ripper.gif
Top-10 German


bejot
  • Members
  • 16 posts
  • Last active: Mar 09 2015 08:30 PM
  • Joined: 01 Nov 2012

Moin,

ich finde es außerordentlich imponierent dass manche Mitglieder in der Lage sind so ein script auf die Beine zu stellen.

(Daumen hoch smiley)

 

Aber als Nichtbabyloner frage ich mich wozu das gut ist.

Wer braucht so ein script?

Wahrscheinlich bin ich zu doof um das Ganze zu durchblicken.

 

Mit freundlichen Grüßen,

 

 

 

 



garry
  • Spam Officer
  • 3219 posts
  • Last active: Sep 20 2018 02:47 PM
  • Joined: 19 Apr 2005

ja, warum nicht , wie beim Lexikon  bzw wikipedia oder Formelbuch  ,  man sucht etwas und kann nachschlagen , oder auch als Allgemeinbildung

ist auch eine interessante mathematische Herausforderung so etwas zu programmieren

( in der Schule lernten wir  binär / octal / hex   )



Dr_Holle
  • Members
  • 105 posts
  • Last active: Mar 26 2014 10:10 AM
  • Joined: 18 Dec 2012

Entstanden ist das ganze als ich beim Geocaching auf ein Rätsel gestoßen bin bei dem die Koordinaten in einem anderen Zahlensystem dargestellt waren. Nun musste ich das also mühsam umrechnen. Als ich das nächste Mal wieder eine Ähnliche Aufgabe lösen musste um an die Koordinaten zu gelangen habe ich dieses Tool geschrieben, damit ich es künftig etwas leichter habe tongue.png .

 

Hier mal ein 2 Beispiele wozu man es brauchen kann (gibt sicher weit mehr Einsatzmöglichkeiten, aber die fallen einem erst ein wenn man es braucht) wink.png :

 

-Kodieren einer INI-Datei:

Es gibt sicher bessere Verschlüsselungs-Methoden (MD5, usw.), aber viele sind "Einwegverschlüsselungen", sprich man kann z.B. ein Passwort mit MD5 verschlüsseln und das Ergebnis mit dem gespeicherten "verschlüsselten" Passwort vergleichen. Wenn man nun aber z.B. Adressdaten speichern will, diese jedoch nicht für jeden lesbar speichern möchte könnte man mit dieser Funktion eine einfache Verschlüsselung realisieren.

Das würde dann z.B. so aussehen: Man nimmt den ASCII-Wert der Zeichen und wandelt diese in ein anderes Zahlenformat um. Nun kann man noch Werte dazu addieren und das Ergebnis erneut in ein anderes Zahlenformat umwandeln, und so weiter. Welche Zahlensysteme man dazu verwendet könnte man auch per Zufall bestimmen und ebenfalls in Kodierter Form mit in der Datei ablegen, so dass man weiß welche Zahlensysteme (und Additionen, usw.) nötig sind um die Daten wieder herzustellen.

Das ist sicher nicht die sicherte Methode um Daten zu verschlüsseln, aber es ist ausreichend um Skripkiddies ein paar Monate zu beschäftigen grin.png .

 

-Eigene Steuerungen benutzen:

Die gängigsten Formate sind zweifellos das Dezimal-System , das Binär-System und das Hexadezimal-System. Doch wozu gibt es überhaupt das Hexadezimal-System?

Nun, ein Byte besteht aus 8 Bit, was wiederum bedeutet das 256 Zustände möglich sind (0-255). Im Dezimalsystem wären dafür 3 Stellen nötig, im Hexadezimal-System reichen 2 Stellen. Zudem ist die Umwandlung vom Binären zum Hexadezimalen einfacher, da jeweils 4 Bits (also 4 binäre Stellen) zu einer Hexadezimalen Ziffer werden, welche dann einfach voreinander gesetzt werden. Für eine Umwandlung ins Dezimale System muss man muss ich stattdessen alles zusammen addieren.

OK, doch wozu braucht man "andere" Zahlensysteme?

Nehmen wir als Beispiel mal eine 7-Segment-Anzeige. Mit 7 Bit kann ich also alle 128 möglichen Zustände darstellen. Im Dezimalen System wären also 3 Stellen nötig, Im Dedezimalen System (Base 12) reichen 2 Stellen aus.

Wenn man nun eine langsame Verbindung hat und möglichst wenig Daten übertragen möchte würde es sich also anbieten das Dedezimale System statt dem Dezimalen System zu verwenden.

Naja, nun werden die meisten "zu recht" sagen dass man dann auch einfach das Hexadezimale System verwenden könnte. Nun nehmen wir jedoch an die Datenübertragung erfolgt mit einem alten Telefon (oder so ein Tongenerator mit dem man den Anrufbeantworter "Fernsteuern" kann). Da hat man die Tasten " 0-9 ", sowie " * " und  "#". Man hat also nur 12 "Töne" zur Verfügung. Würde man nun also aus seinem alten Kram eine "Fernsteuerung" basteln wollen ohne diese "Umzubauen" könnte man also die 7-Segment-Anzeige mit dem Dedezimalen System mit 2 aufeinander folgenden Tönen steuern, statt mit 3 aufeinander folgenden Tönen (die beim Gebrauch des Dezimalen Systems nötig wären).

Dieses Beispiel ist sicher "sehr speziell" wink.png  , aber es dient auch nur als Beispiel. Außergewöhnliche Zahlensysteme könnten immer dann Verwendung finden, wenn man mit wenig Ressourcen auskommen muss.

 

Gruß, Holle



garry
  • Spam Officer
  • 3219 posts
  • Last active: Sep 20 2018 02:47 PM
  • Joined: 19 Apr 2005

Dr_Holle, danke für die Erklärungen,

btw

anbei link zu DTMF (Dual-tone multi-frequency )  , 2 Töne miteinander werden für 1 Ziffer gesendet , 7 Frequenzen werden gebraucht für 0-9 * #

http://de.wikipedia....nzwahlverfahren

DTMF frequence Hz

            1209  1336  1477  1633

       697    1     2     3     A

       770    4     5     6     B

       852    7     8     9     C

       941    *     0     #     D


bejot
  • Members
  • 16 posts
  • Last active: Mar 09 2015 08:30 PM
  • Joined: 01 Nov 2012
Dr_Holle:

auch von mir ein Danke für die ausführliche Erklärung.

Die Verschlüsselung einer .INI finde ich sehr interessant.

Werde ich mal versuchen.

 

Gruß

bejot



Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012

Ich habe einen Bug entdeckt:

Beispiel: MsgBox % Convert("(27)(20)", "base30", "base10")

 

Man bekommt eine Fehlermeldung, dass eine Stelle im Base30-System maximal den Wert 29 besitzen kann. 27 und 20 sind jedoch kleiner als 29.

Das Problem tritt bei allen Zahlen auf bei denen 2 oder mehr Stellen mit Klammer angegeben werden.


Find the recent autohotkey version here: ahkscript.org


Dr_Holle
  • Members
  • 105 posts
  • Last active: Mar 26 2014 10:10 AM
  • Joined: 18 Dec 2012

anbei link zu DTMF (Dual-tone multi-frequency ) , 2 Töne miteinander werden für 1 Ziffer gesendet , 7 Frequenzen werden gebraucht für 0-9 * #

Vielen Dank, für den Hinweis. Da war mein Beispiel ein Griff in Klo wink.png . Aber nehmen wir mal an man würde für die 12 Zeichen auch 12 Töne brauchen, dann würde das Beispiel noch greifen grin.png .

 

 

Ich habe einen Bug entdeckt:
Beispiel: MsgBox % Convert("(27)(20)", "base30", "base10")
 
Man bekommt eine Fehlermeldung, dass eine Stelle im Base30-System maximal den Wert 29 besitzen kann. 27 und 20 sind jedoch kleiner als 29.
Das Problem tritt bei allen Zahlen auf bei denen 2 oder mehr Stellen mit Klammer angegeben werden.

Oh, vielen Dank für den Bug-Report. Werde mir das gleich mal ansehen.

* Edit: Ist nun gefixed. Das Script habe ich im ersten Beitrag ersetzt.



Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012

Danke!


Find the recent autohotkey version here: ahkscript.org


nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Kannst du den Kern von dem ganzen als eigenständiges Skript posten?

Also der Teil der nur noch mit Zahlen und Strings arbeitet also ohne die Namen?

Das wäre sehr Nett


Visit the new forum ahkscript.org.

http://ahkscript.org


Dr_Holle
  • Members
  • 105 posts
  • Last active: Mar 26 2014 10:10 AM
  • Joined: 18 Dec 2012

Sorry, ich verstehe gerade nicht so ganz was du meinst.

 

Der "Kern" ist eigentlich die Funktion "Convert", alles davor ist nur für die GUI.

In dieser Funktion kommen nun diverse Abfragen ob die eingegebenen Werte "korrekt" sind.

Zudem werden die Klammern aufgeschlüsselt.

Wenn alles passt, dann kommt die eigentliche Konvertierung, in der zur Berechnung die Buchstaben durch Zahlen ersetzt werden.

Die Berechnung funktioniert so, dass die Eingabe zuerst ins Dezimale System konvertiert, und von da in das Zielsystem konvertiert wird.

Ist das Zielsystem das Dezimale, dann wird der letzte Schritt natürlich übersprungen.

 

Solltest du das so meinen dass lediglich keine Meldungen erscheinen, auch wenn eine Eingabe falsch ist, dann brauchst du einfach nur die MessageBoxen zu löschen, denn die Überprüfung muss ja trotzdem stattfinden.



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

OK Ich hatte es aber schon gefunden

   con_letter := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"                         ; Erlaubte Buchstaben
    result_dec =
    length := StrLen(value)                                            ; die Anzahl der Stellen des umzuwandelnden Wertes ermitteln
    counter := 0
    parenthesis := False                                               ; bisher keine Klammer
    loop, %length%                                                     ; für jede Stelle des Wertes einen Schleifendurchlauf
    {
        StringMid, char, value, (length + 1 - A_Index), 1              ; "Rückwärtslaufend" den Wert Zeichen für Zeichen bearbeiten
        if (char = ")")                                                ; wenn man auf eine öffnende Klammer trifft...
        {                                                              ; (bedenke wir bearbeiten gerade von hinten nach vorne)
            if parenthesis                                             ; ...obwohl man sich schon in einer befindet...
            {                                                          ; ...dann abbrechen
                MsgBox, 4096 , , Fehler!`nEs werden ausschließlich einfache Klammernpaare akzeptiert!`n`nBeispiel:`n57AH6(45)(48)G2 = Akzeptiert`n57AH6((45)(48))G2 = NICHT akzeptiert!
                Exit
            }
            parenthesis := True                                        ; ansonsten merken dass man nun in einer Klammer ist
            Continue                                                   ; ...den Rest der Schleife überspringen und fortfahren
        }
        else if parenthesis                                            ; ist man gerade in einer Klammer...
        {
            if char is not Integer                                     ; und findet dort etwas anderes als eine Zahl, dann abbrechen
            {
                if (char = "(")                                        ; Wenn man auf eine schließende Klammer trifft...
                {                                                      ; (bedenke wir bearbeiten gerade von hinten nach vorne)
                    parenthesis := False                               ; Merken dass man nun NICHT mehr der Klammer ist
                    if !par_char                                       ; war die Klammer leer...
                    {                                                  ; ...dann abbrechen
                        MsgBox, 4096 , , Fehler! `nKlammerinhalt ohne Wert!
                        Exit
                    }
                    char := par_char                                   ; ansonsten alle Zahlen des Klammerinhalts als "einen" Wert zuordnen
                    par_char =                                         ; und den Inhalt von par_char löschem
                }                
                else                                                   ; Das aktuell zu prüfende Zeichen ist keine Zahl und keine "(", obwohl man sich in einer Klammer befindet,
                {                                                      ; also abbrechen
                    MsgBox, 4096 , , Fehler! `nInnerhalb von Klammern werden nur Zahlen akzeptiert!
                    Exit
                }
            }
            else                                                       ; Wir befinden uns in einer Klammer und treffen auf eine Zahl...
            {
                par_char := char . par_char                            ; alos die Zahl zusammen setzen bis die Klammer beendet wird. Da wir ja "Rückwärts" laufen,
                Continue                                               ; wird die neue Zahl nicht an die alte gehängt, sondern "davor" gesetzt.
            }
        }
        else if (char = "(")                                           ; Wenn man auf eine schließende Klammer trifft obwohl man sich nicht in einer Klammer befindet...
        {                                                              ; ...dann abbrechen
            MsgBox, 4096 , , Fehler!`nEs werden ausschließlich einfache Klammernpaare akzeptiert!`n`nBeispiel:`n57AH6(45)(48)G2 = Akzeptiert`n57AH6((45)(48))G2 = NICHT akzeptiert!
            Exit
        }
        else if char is Alpha                                          ; Man ist nicht in einer Klammer und das Zeichen ist weder "(" noch ")". Wenn man nunauf einen Buchstaben stößt...
        {
            StringGetPos, char_pos, con_letter, %char%                 ; dann prüfe an wievielter Stelle dieser in "con_letter" steht
            StringReplace, char, char, %char%, %char_pos%              ; und ersetze dann diesen Buchstaben durch die Position
            char += 10                                                 ; und addiere 10 dazu
            if (char >= from)
            {                                                          ; wenn die Zahl größer ist als das Zahlensystem
                StringGetPos, seperator_1, base%from%, |, L1           ; z.B., 18 in einem Hexadezimalsystem
                StringGetPos, seperator_2, base%from%, |, L2           ; dann breche ab
                StringMid, name_from, base%from%, (seperator_1 + 2), (seperator_2 - seperator_1 - 1)
                StringLower, name_from, name_from, T
                char := from - 10
                StringMid, char, con_letter, %char%, 1
                MsgBox, 4096 , , Fehler! `nIm %name_from%-System werden nur die Buchstaben bis "%char%" verwendet!
                Exit
            }
        }
        if (char >= from)                                              ; ist das Zeichen an der Stelle kein Buchstabe sondern eine Zahl,
        {                                                              ; welche jedoch größer ist als das Zahlensystem, dann breche ab
            max_value := from - 1
            MsgBox, 4096 , , Fehler! `nIm Base%from%-System hat eine Stelle nur den Wert von 0-%max_value%
            Exit
        }
        result_dec += char * (from**counter)                           ; ansonsten rechne das Quell-Zahlensystem in das
        counter ++                                                     ; dezimale Zahlensystem um und erhöhe den Counter um eins (nächste Stelle)
    }
    if (to = 10)                                                       ; ist das Ziel-Zahlensystem das Dezimal-System
        Return %result_dec%                                            ; dann liefere das Ergebnis zurück
    result=                                                            ; ansonsten rechne dieses in das Ziel-Zahlensystem um...
    while (result_dec)
    {       
        char := Mod(result_dec , to)                                   ; 1.Zahl des Ziel-Zahlensystems ermitteln
        if (char > 35)                                                 ; ist dieses Zeichen größer als 35,
            char := "(" . char . ")"                                   ; ...dann setze Klammern darum
        else if (char > 9)                                             ; ist es kleiner als 36 aber größer als 9,
            StringMid, char, con_letter, (char - 9), 1                 ; ...dann setze einen Buchstaben dafür ein
        result :=  char . result                                       ; setze das Ergebnis zusammen
        result_dec := Floor(result_dec / to)                           ; rechne den "rest" aus, um damit weiter zu rechnen
    }
    Return %result%                                                    ; liefere das Ergebnis zurück

Trotztdem Danke


Visit the new forum ahkscript.org.

http://ahkscript.org