Binär nach Dezimal

    • Offizieller Beitrag

    Hallo!

    Mein nächstes Script ist fertig. :)

    Damit kann man einen 24 Bit Binärcode nach Dezimal 'umwandeln' und andersrum. Grafisch dargestellt durch Schalter und Leuchtdioden.
    Es sind 2 Icons erforderlich, die in dem Zip-Archiv liegen. Das Zip-Archiv einfach ins Script-Verzeichnis entpacken.

    Es gibt eine neue Version. Hier mal die Änderungen:

    - jetzt 24 Bit statt bisher 16 Bit
    - Bit 0 ist jetzt rechts :)
    - es gibt jetzt einen Zähler mit [Start], [Pause] und [Stop] plus Geschwindigkeitsregler
    - das Umrechnungsergebnis kann man nun markieren und in die Zwischenablage kopieren
    - Umrechnung von dezimal nach binär ist jetzt auch möglich

    Die Icons sind auch neu, also das Icons.zip bitte mit downloaden.

    Noch eine neuere Version. Mir ist noch was eingefallen:

    - Man kann dem Zähler jetzt einen beliebigen Startwert vorgeben.
    - Im Pause-Modus des Zählers kann man den Zählerstand verändern. Nach der Pause wird dann mit dem neuen Zählerstand weitergezählt.
    - Das Flackern beim ganz schnellen zählen ist behoben.
    - Die Eingabe wird überprüft, ob sie größer ist als 24 Bit
    - Mehr Kommentare (ich bin selbst schon fast nicht mehr durchgestiegen)

    Version 1.3 - Neue Funktionen:

    - Der Zähler kann jetzt vorwärts oder rückwärts zählen (umschaltbar auch während des zählens)
    - Ergebnis (Dezimal oder Binär) kann nun per Button (One-Klick) in die Zwischenablage befördert werden.
    - Ein paar kosmetische Korrekturen :)


    Spoiler anzeigen
    [autoit]


    #AutoIt3Wrapper_Res_Language=1031 ;Resource Language code . default 2057=English (United Kingdom)
    #AutoIt3Wrapper_Res_Comment=Bin2Dez
    #AutoIt3Wrapper_Res_Description=Damit kann man einen 24 Bit Binaercode nach Dezimal umwandeln.
    #AutoIt3Wrapper_Res_Fileversion=1.3.0.0 ;File Version
    #AutoIt3Wrapper_Res_FileVersion_AutoIncrement=n ;(y/n/p)AutoIncrement FileVersion After Aut2EXE is finished. y=Yes/n=No/P=Prompt default=n
    #AutoIt3Wrapper_Res_LegalCopyright=Thomas Stephan
    #AutoIt3Wrapper_Res_Field=Email|[email='oscar@elektronik-kurs.de'][/email]
    #AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer%
    #AutoIt3Wrapper_Res_Field=created on:|%longdate% %time%

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

    #include <GUIConstants.au3>
    Opt("GUIOnEventMode", 1)

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

    If Not FileExists("schalter_an.ico") Then
    MsgBox(48, "Bin2Dez", "Es fehlt folgende Datei: schalter_an.ico" & @CRLF & "Das Programm wird beendet!")
    Exit
    EndIf

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

    If Not FileExists("schalter_aus.ico") Then
    MsgBox(48, "Bin2Dez", "Es fehlt folgende Datei: schalter_aus.ico" & @CRLF & "Das Programm wird beendet!")
    Exit
    EndIf

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

    $gMaxBits = 23; Maximale Bitzahl -1 (hier: 24 Bit = 0...23)

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

    Dim $gaSBit[$gMaxBits+1]
    Dim $gaDBit[$gMaxBits+1]
    Dim $gaWert[$gMaxBits+1]
    Dim $gaButton[6]

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

    Global $gStop, $gStart, $gPause, $gTmp1, $gTmp2, $gx, $gZaehler
    Global $gBgColor = 0x909090; Hintergrundfarbe
    Global $gUsColor = 0xeeeeee; Vordergrundfarbe der Überschrift
    Global $gBsColor = 0x000000; Vordergrundfarbe der Bitbeschriftung
    Global $gBwVColor = 0xcccccc; Vordergrundfarbe der Bitwerte
    Global $gBwHColor = 0xffff00; Hintergrundfarbe der Bitwerte
    Global $gGeschw = 50; Startwert für die Zählergeschwindigkeit
    Global $gZaehlRichtung = 1; 1= vorwärts, -1= rückwärts

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

    $gMain = GUICreate("Bin2Dez", 940, 330, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "f_Beenden")
    GUISetBkColor($gBgColor, $gMain)

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

    GUICtrlCreateLabel("24 Bit Binär / Dezimal",270,5,600,60)
    GUICtrlSetFont(-1,32,800, "Tahoma")
    GUICtrlSetColor(-1,$gUsColor)

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

    GUICtrlCreateLabel("Bit: ",8,58,40,20)
    GUICtrlSetFont(-1,12,800, "Tahoma")
    GUICtrlSetColor(-1,$gBsColor)

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

    GUICtrlCreateLabel("Wert:",8,171,40,20)
    GUICtrlSetFont(-1,10,800, "Tahoma")
    GUICtrlSetColor(-1,0xffff00)

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

    GUICtrlCreateGroup ("Zähler", 535, 200, 395, 120)
    GUICtrlSetFont(-1,10,400, "Tahoma")
    $gaButton[0] = GUICtrlCreateButton("Start",685,235,60,30)
    GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
    $gaButton[1] = GUICtrlCreateButton("Pause",755,235,60,30)
    GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
    GUICtrlSetState(-1,$GUI_DISABLE)
    $gaButton[2] = GUICtrlCreateButton("Stop",825,235,60,30)
    GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
    GUICtrlSetState(-1,$GUI_DISABLE)
    $gSlider = GUICtrlCreateSlider(685, 275, 200, 25)
    GUICtrlSetData(-1,$gGeschw)
    GUICtrlSetOnEvent(-1, "f_Tempo")
    GUICtrlCreateLabel("Geschwindigkeit: min.",555,280,129,20)
    GUICtrlSetFont(-1,8,800, "Tahoma")
    GUICtrlSetColor(-1,$gUsColor)
    GUICtrlCreateLabel("max.",889,280,30,20)
    GUICtrlSetFont(-1,8,800, "Tahoma")
    GUICtrlSetColor(-1,$gUsColor)
    GUICtrlCreateLabel("Richtung:",555,237,45,20)
    GUICtrlSetFont(-1,8,800, "Tahoma")
    GUICtrlSetColor(-1,$gUsColor)
    $gaButton[3] = GUICtrlCreateButton("vorwärts",605,235,65,20)
    GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
    GUICtrlSetFont(-1,8,800, "Tahoma")
    GUICtrlCreateGroup ("",-99,-99,1,1)

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

    For $gx = $gMaxBits To 0 Step -1
    $gaWert[$gx] = 0
    $gTmp2 = $gMaxBits - $gx
    $gTmp1 = StringFormat("% 4u",($gx))
    GUICtrlCreateLabel($gTmp1,48+$gTmp2*37,60,30,16)
    GUICtrlSetFont(-1,10,400, "Tahoma")
    GUICtrlSetColor(-1,$gBsColor)
    $gaSBit[$gx] = GUICtrlCreateIcon("schalter_aus.ico", -1, 50+$gTmp2*37, 75, 25, 85)
    GUICtrlSetOnEvent(-1, "f_Schalten")
    $gTmp1 = StringFormat("% 7u",(2^$gx))
    $gaDBit[$gx] = GUICtrlCreateLabel($gTmp1,50+$gTmp2*37,175,35,10)
    GUICtrlSetFont(-1,7,400, "Tahoma")
    GUICtrlSetColor(-1,$gBwVColor)
    Next

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

    GUICtrlCreateGroup ("Ergebnis", 8, 200, 520, 120)
    GUICtrlSetFont(-1,10,400, "Tahoma")
    GUICtrlCreateLabel("Dezimal = ",26,224,200,60)
    GUICtrlSetFont(-1,28,800, "Tahoma")
    GUICtrlSetColor(-1,$gUsColor)
    $gDez = GUICtrlCreateInput("0",220,220,230,50)
    GUICtrlSetFont(-1,28,800, "Tahoma")
    GUICtrlSetColor(-1,$gBsColor)
    GUICtrlSetOnEvent(-1, "f_Eingabe")
    $gaButton[4] = GUICtrlCreateButton("kopieren",455,234,55,20)
    GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
    GUICtrlSetFont(-1,8,800, "Tahoma")
    GUICtrlCreateLabel("Binär = ",110,280,200,30)
    GUICtrlSetFont(-1,20,800, "Tahoma")
    GUICtrlSetColor(-1,$gUsColor)
    $gBin = GUICtrlCreateInput("000000000000000000000000",220,286,230,20, $ES_READONLY)
    GUICtrlSetFont(-1,10,800, "Tahoma")
    GUICtrlSetColor(-1,$gBsColor)
    $gaButton[5] = GUICtrlCreateButton("kopieren",455,286,55,20)
    GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
    GUICtrlSetFont(-1,8,800, "Tahoma")
    GUICtrlCreateGroup ("",-99,-99,1,1)

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

    GUISetState(@SW_SHOW)

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

    ;-----------------------------------------------------------------------------
    ; Hauptschleife
    ;-----------------------------------------------------------------------------
    While 1
    GUICtrlSetState($gDez, $GUI_FOCUS)
    Do
    Sleep(10)
    Until $gStart = 1
    GUICtrlSetState($gaButton[0],$GUI_DISABLE)
    GUICtrlSetState($gaButton[1],$GUI_ENABLE)
    GUICtrlSetState($gaButton[2],$GUI_ENABLE)
    $gStart = 0
    $gZaehler = GUICtrlRead($gDez); Startwert für den Zähler holen
    Do; Hier startet der Zähler
    For $gx = 0 To $gMaxBits; Die entsprechenden Bits von $gZaehler setzen bzw. löschen
    If BitAnd($gZaehler, 2^$gx) Then
    If $gaWert[$gx] = 0 Then; nur setzen, wenn noch nicht gesetzt
    $gaWert[$gx] = 1
    GUICtrlSetImage($gaSBit[$gx],"schalter_an.ico")
    GUICtrlSetColor($gaDBit[$gx],$gBsColor)
    GUICtrlSetBkColor($gaDBit[$gx],$gBwHColor)
    EndIf
    Else
    If $gaWert[$gx] = 1 Then; nur löschen, wenn noch nicht gelöscht
    GUICtrlSetImage($gaSBit[$gx],"schalter_aus.ico")
    GUICtrlSetColor($gaDBit[$gx],$gBwVColor)
    GUICtrlSetBkColor($gaDBit[$gx],$gBgColor)
    $gaWert[$gx] = 0
    EndIf
    EndIf
    Next
    If $gPause = 1 Then; Wenn der Benutzer auf [Pause] geklickt hat
    GUICtrlSetState($gaButton[2],$GUI_DISABLE)
    GUICtrlSetData($gaButton[1],"Weiter")
    Do
    Sleep(10)
    Until $gPause = 0; warten bis er die Pause beendet
    $gZaehler = GUICtrlRead($gDez); wenn der Benutzer inzwischen den Wert verändert hat, Zählerwert ändern
    GUICtrlSetData($gaButton[1],"Pause")
    GUICtrlSetState($gaButton[2],$GUI_ENABLE)
    EndIf
    If $gStop = 1 Then; Wenn der Benutzer auf [Stop] geklickt hat
    $gStop = 0; Werte zurücksetzen und für neuen Zählerstart vorbereiten
    $gZaehler = 1
    For $gx = 0 To $gMaxBits
    $gaWert[$gx] = 0
    GUICtrlSetImage($gaSBit[$gx],"schalter_aus.ico")
    GUICtrlSetColor($gaDBit[$gx],$gBwVColor)
    GUICtrlSetBkColor($gaDBit[$gx],$gBgColor)
    Next
    f_Berechnen()
    ExitLoop; Zählerschleife verlassen
    EndIf
    f_Berechnen()
    Sleep(10*(100-$gGeschw)); Warteschleife, die mit dem Slider beeinflusst werden kann
    $gZaehler += $gZaehlRichtung
    Until ($gZaehler < 0) or ($gZaehler >= 2^($gMaxBits+1)); 24 Bit überschritten oder kleiner als 0? Ja, dann Zählerschleife verlassen
    GUICtrlSetState($gaButton[1],$GUI_DISABLE); [Pause] sperren
    GUICtrlSetState($gaButton[2],$GUI_DISABLE); [Stop] sperren
    GUICtrlSetState($gaButton[0],$GUI_ENABLE); [Start]-Button wieder freigeben
    WEnd
    ;-----------------------------------------------------------------------------
    ;-----------------------------------------------------------------------------

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

    ;******************************************************************************************
    ; Diese Funktion wird aufgerufen, wenn der Benutzer das Programm beenden will
    ;******************************************************************************************
    Func f_Beenden()
    Exit
    EndFunc

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

    ;******************************************************************************************
    ; Diese Funktion wird aufgerufen, wenn einer der grafischen Schalter angeklickt wurde
    ;******************************************************************************************
    Func f_Schalten()
    Local $lAusw = (@GUI_CTRLID - $gaSBit[$gMaxBits]) / 3
    $lAusw = $gMaxBits - $lAusw
    $gaWert[$lAusw] = Not $gaWert[$lAusw]
    Switch $gaWert[$lAusw]
    Case 0
    GUICtrlSetImage($gaSBit[$lAusw],"schalter_aus.ico")
    GUICtrlSetColor($gaDBit[$lAusw],$gBwVColor)
    GUICtrlSetBkColor($gaDBit[$lAusw],$gBgColor)
    Case 1
    GUICtrlSetImage($gaSBit[$lAusw],"schalter_an.ico")
    GUICtrlSetColor($gaDBit[$lAusw],$gBsColor)
    GUICtrlSetBkColor($gaDBit[$lAusw],$gBwHColor)
    EndSwitch
    f_Berechnen()
    GUICtrlSetState($gDez, $GUI_FOCUS)
    EndFunc

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

    ;******************************************************************************************
    ; Diese Funktion berechnet die Dezimal- und Binärwerte und zeigt sie an
    ;******************************************************************************************
    Func f_Berechnen()
    Local $lErgDez = 0
    Local $lErgBin = ""
    For $lx = $gMaxBits To 0 Step -1
    $lErgDez += 2^$lx*$gaWert[$lx]
    Switch $gaWert[$lx]
    Case 0
    $lErgBin &= "0"
    Case 1
    $lErgBin &= "1"
    EndSwitch
    Next
    GUICtrlSetData($gDez, $lErgDez)
    GUICtrlSetData($gBin, $lErgBin)
    EndFunc

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

    ;******************************************************************************************
    ; Diese Funktion wird aufgerufen, wenn der Benutzer einen der Buttons angeklickt hat
    ;******************************************************************************************
    Func f_Zaehlertasten()
    Local $lAusw = @GUI_CtrlId
    Switch $lAusw
    Case $gaButton[0]; Start
    $gStart = 1
    Case $gaButton[1]; Pause
    $gPause = Not $gPause
    Case $gaButton[2]; Stop
    $gStop = 1
    Case $gaButton[3]; Zaehlrichtung änder
    $gZaehlRichtung = -$gZaehlRichtung
    Beep(400,50)
    If $gZaehlRichtung = 1 Then
    GUICtrlSetData($gaButton[3],"vorwärts")
    Else
    GUICtrlSetData($gaButton[3],"rückwärts")
    EndIf
    Case $gaButton[4]; Dezimal-Ergebnis in die Zwischenablage kopieren
    ClipPut(GUICtrlRead($gDez))
    Beep(800,50)
    Case $gaButton[5]; Binär-Ergebnis in die Zwischenablage kopieren
    ClipPut(GUICtrlRead($gBin))
    Beep(800,50)
    EndSwitch
    GUICtrlSetState($gDez, $GUI_FOCUS)
    EndFunc

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

    ;******************************************************************************************
    ; Diese Funktion wird aufgerufen, wenn der Benutzer den Slider verändert
    ;******************************************************************************************
    Func f_Tempo()
    $gGeschw = GUICtrlRead($gSlider)
    EndFunc

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

    ;******************************************************************************************
    ; Diese Funktion wird aufgerufen, wenn der Benutzer etwas in Dezimalfeld eingibt
    ;******************************************************************************************
    Func f_Eingabe()
    Local $lx
    Local $ld = GUICtrlRead($gDez)
    If $ld >= 2^($gMaxBits+1) Then
    MsgBox(48,"Bin2Dez","Die eingegebene Zahl ist zu groß!" & @CRLF & "Sie läßt sich mit " & $gMaxBits+1 & " Bit nicht darstellen.")
    GUICtrlSetData($gDez,0)
    GUICtrlSetState($gDez, $GUI_FOCUS)
    $ld = -1
    EndIf
    If $ld >= 0 Then
    $gZaehler = $ld
    For $lx = 0 To $gMaxBits
    If BitAnd($ld, 2^$lx) Then
    If $gaWert[$lx] = 0 Then
    $gaWert[$lx] = 1
    GUICtrlSetImage($gaSBit[$lx],"schalter_an.ico")
    GUICtrlSetColor($gaDBit[$lx],$gBsColor)
    GUICtrlSetBkColor($gaDBit[$lx],$gBwHColor)
    EndIf
    Else
    If $gaWert[$lx] = 1 Then
    $gaWert[$lx] = 0
    GUICtrlSetImage($gaSBit[$lx],"schalter_aus.ico")
    GUICtrlSetColor($gaDBit[$lx],$gBwVColor)
    GUICtrlSetBkColor($gaDBit[$lx],$gBgColor)
    EndIf
    EndIf
    Next
    f_Berechnen()
    GUICtrlSetState($gDez, $GUI_FOCUS)
    EndIf
    EndFunc

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


    MfG. Oscar

    • Offizieller Beitrag

    Der fleißige Oskar :)
    Zum Posten vielleicht folgende Anregung: Poste doch den Quelltext direkt mit im Beitrag (Einschließen in [.Spoiler][.AutoIt] und [/AutoIt][/Spoiler]) und hänge dann ein Archiv mit Skript und Zusatzdateien an. So kann an einerseits schnell einen Blick in den Source werfen und andererseits gleich alles zusammen herunterladen. Nur eine Anregung, aber ich glaube, dass das eine Überlegung wert ist :).

    Bleib weiter so aktiv,
    peethebee