Integer <=> Binary Converter v1.0 Build 2011-09-19

  • Ein kleines Tool zum Umwandlen zwischen Integer- und Binärzahlen:

    Spoiler anzeigen
    [autoit]


    ;coded by UEZ 2010
    #AutoIt3Wrapper_UseX64=n
    #AutoIt3Wrapper_Change2CUI=n
    #AutoIt3Wrapper_Res_Description=Converter between integer <=> binary
    #AutoIt3Wrapper_Res_Fileversion=1.0
    #AutoIt3Wrapper_Res_Language=1033
    #AutoIt3Wrapper_Res_LegalCopyright=UEZ 2010
    #AutoIt3Wrapper_Res_Field=Coded by|UEZ
    #AutoIt3Wrapper_Res_Field=Build|2011-09-19
    #AutoIt3Wrapper_Res_Field=Compile date|%longdate% %time%
    #AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer%
    #AutoIt3Wrapper_Run_Obfuscator=y
    #Obfuscator_Parameters=/sf /sv /om /cs=0 /cn=0
    #AutoIt3Wrapper_Res_SaveSource=n
    #AutoIt3Wrapper_UseUpx=y
    #AutoIt3Wrapper_UPX_Parameters=--best --lzma
    #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_Obfuscated.au3"
    ;~ #AutoIt3Wrapper_Run_After=Upack.exe "%out%" -c6 -f273 -red

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

    #include <ButtonConstants.au3>
    #include <Constants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <String.au3>
    #include <StaticConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

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

    #Region
    $title = "Integer <=> Binary Converter by UEZ "
    $ver = " v1.0 Build 2011-09-19"
    $hWnd = GUICreate($title & $ver, 625, 336)

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

    $MenuItem1 = GUICtrlCreateMenu("Help")
    $MenuItem2 = GUICtrlCreateMenuItem("About", $MenuItem1)
    $MenuItem4 = GUICtrlCreateMenuItem("Exit", $MenuItem1)

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

    $Input = GUICtrlCreateInput("", 104, 144, 203, 30)
    GUICtrlSetTip($Input , "Enter here an integer number up to 15 digits to convert it to binary on-the-fly!")
    $fsize = 16
    GUICtrlSetFont(-1, $fsize, 400, 0, "Times New Roman")
    GUICtrlSetLimit($Input, 15)

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

    #Region Caret (Cursor) ;thanks to Yashied
    $hInput1 = GUICtrlGetHandle($Input)
    $cursor_size_x = $fsize
    $cursor_size_y = 23

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

    $tIcon = DllStructCreate("hwnd")
    $tID = DllStructCreate("hwnd")
    $sIcon = @SystemDir & "\shell32.dll"
    ;~ $max_icons = _WinAPI_ExtractIconEx($sIcon, -1, 0, 0, 0)
    $iBackground = 0xFFFFFF
    $iIndex = 130 ;should be the butterfly icon
    ;~ $iIndex = Random(0, $max_icons, 1)
    DllCall("user32.dll", "int", "PrivateExtractIcons", "str", $sIcon, "int", $iIndex, "int", $cursor_size_x, "int", $cursor_size_y, "ptr", DllStructGetPtr($tIcon), "ptr", DllStructGetPtr($tID), "int", 1, "int", 0)
    $hIcon = DllStructGetData($tIcon, 1)
    $hDC = _WinAPI_GetDC(0)
    $hBackDC = _WinAPI_CreateCompatibleDC($hDC)
    $hBitmap = _WinAPI_CreateSolidBitmap($hWnd, 0xFFFFFF - $iBackground, $cursor_size_x, $cursor_size_y)
    $hBackSv = _WinAPI_SelectObject($hBackDC, $hBitmap)
    $hFrontDC = _WinAPI_CreateCompatibleDC($hDC)
    $hInv = _WinAPI_CreateSolidBitmap($hWnd, $iBackground, $cursor_size_x, $cursor_size_y)
    $hFrontSv = _WinAPI_SelectObject($hFrontDC, $hInv)

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

    _WinAPI_DrawIconEx($hFrontDC, 0, 0, $hIcon, 0, 0, 0, 0, $DI_NORMAL)
    _WinAPI_BitBlt($hBackDC, 0, 0, $cursor_size_x, $cursor_size_y, $hFrontDC, 0, 0, $NOTSRCCOPY) ;invert icon color
    _WinAPI_SelectObject($hFrontDC, $hFrontSv)
    _WinAPI_SelectObject($hBackDC, $hBackSv)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    _WinAPI_DeleteDC($hFrontDC)
    _WinAPI_DeleteDC($hBackDC)
    _WinAPI_DeleteObject($hIcon)
    _WinAPI_DeleteObject($hInv)

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

    $pHook = DllCallbackRegister("_WM_CARET", "ptr", "hwnd;uint;long;ptr")
    $hProc = _WinAPI_SetWindowLong($hInput1, $GWL_WNDPROC, DllCallbackGetPtr($pHook))
    $BlinkTime_save = DllCall('user32.dll', 'int', 'GetCaretBlinkTime')
    $BlinkTime = Int($BlinkTime_save[0] / 2) ;-1 -> no blinking cursor
    #EndRegion

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

    $Edit = GUICtrlCreateEdit("", 104, 200, 345, 89, $ES_NOHIDESEL + $ES_LEFT)
    GUICtrlSetLimit($Edit, 64)
    GUICtrlSetTip($Edit , "Enter here a binary number up to 52 digits to convert it to integer on-the-fly!")
    GUICtrlSetFont($Edit, 56, 400, 0, "Arial")

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

    $LabelS = GUICtrlCreateLabel("Integer <=> Binary Converter", 19, 34, 595, 65)
    GUICtrlSetColor(-1, 0x202060) ;RGB
    GUICtrlSetFont(-1, 36, 800, 2, "Times New Roman", 4)
    $Label1 = GUICtrlCreateLabel("Integer <=> Binary Converter", 16, 35, 595, 65)
    GUICtrlSetBkColor(-1, -2)
    GUICtrlSetFont($Label1, 36, 800, 2, "Times New Roman", 4)
    GUICtrlSetColor(-1, 0x5080F0)

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

    $Group1 = GUICtrlCreateGroup("", 8, 16, 609, 89)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    $Group2 = GUICtrlCreateGroup("UEZ 2010", 8, 120, 609, 185, $BS_RIGHT)
    GUICtrlSetFont(-1, 6, 400, 0, "Times New Roman")
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    $Label2 = GUICtrlCreateLabel("Integer:", 54, 146, 44, 24)
    GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")

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

    $Label3 = GUICtrlCreateLabel("Binary:", 56, 204, 44, 30)
    GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")

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

    $Label4 = GUICtrlCreateLabel("Hex: 0", 460, 204, 150, 30)
    GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")
    GUICtrlSetTip($Label4, "To hex number conversation")

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

    $Label5 = GUICtrlCreateLabel("Oct: 0", 460, 224, 150, 40)
    GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")
    GUICtrlSetTip($Label5, "To octal number conversation")

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

    $Button1 = GUICtrlCreateButton("Exit", 536, 264, 75, 25)
    $Button2 = GUICtrlCreateButton("Clipboard", 456, 264, 75, 25)
    GUICtrlSetTip($Button2 , "Press Clipboard to get binary number copied to clipboard")
    $Button3 = GUICtrlCreateButton("Clipboard", 314, 146, 75, 25)
    GUICtrlSetTip($Button3 , "Press Clipboard to get integer number copied to clipboard")

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

    GUISetState(@SW_SHOW)
    GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')
    #EndRegion

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $Button1, $MenuItem4
    DllCall('user32.dll', 'int', 'SetCaretBlinkTime', 'uint', $BlinkTime_save[0])
    _WinAPI_SetWindowLong($hInput1, $GWL_WNDPROC, $hProc)
    DllCallbackFree($pHook)
    GUIRegisterMsg($WM_COMMAND, "")
    GUIDelete($hWnd)
    Exit
    Case $Button2
    ClipPut(StringRegExpReplace(GUICtrlRead($Edit), "[' ']", ""))
    MsgBox(64, "Clipboard", "Binary number copied to clipboard", 10)
    Case $Button3
    ClipPut(GUICtrlRead($Input))
    MsgBox(64, "Clipboard", "Integer number copied to clipboard", 10)
    Case $MenuItem2
    MsgBox(0, $title, $title & $ver & @CRLF & @CRLF & "Thanks to Yashied for the caret code ;-)"& @CRLF & @CRLF & @CRLF & "Br," & @CRLF & "UEZ", 30)
    EndSwitch
    WEnd

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

    Func Integer2Binary($in)
    If $in = 0 Then Return 0
    Local $bin
    While $in > 0
    $bin &= Mod($in, 2)
    $in = Floor($in / 2)
    ;~ $in = BitShift($in, 1)
    WEnd
    Return(_StringReverse($bin))
    EndFunc

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

    Func Binary2Integer($in)
    Local $int, $x, $i = 1, $aTmp = StringSplit(_StringReverse($in), "")
    For $x = 1 To UBound($aTmp) - 1
    $int += $aTmp[$x] * $i
    $i *= 2
    Next
    $aTmp = 0
    Return StringFormat('%.0f', $int)
    EndFunc

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

    Func Integer2Hex($in)
    Local $aHex[16] = [0, 1, 2, 3, 4, 5 ,6 ,7 ,8, 9, "A", "B", "C", "D", "E", "F"]
    Local $hex
    While 1
    $hex &= $aHex[Mod($in, 0x10)]
    $in = Floor($in / 0x10)
    If Not $in Then ExitLoop
    WEnd
    Return _StringReverse($hex)
    EndFunc

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

    Func Integer2Octal($in)
    Local $oct, $t, $r
    While 1
    $oct &= Mod($in, 0x8)
    $in = Floor($in / 0x8)
    If Not $in Then ExitLoop
    WEnd
    Return _StringReverse($oct)
    EndFunc

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

    Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $inp, $integer, $chk, $b, $c, $sLen, $int2

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

    $chk = BitAND($wParam, 0x0000FFFF)
    Switch $chk
    Case $Input
    $inp = GUICtrlRead($Input)
    $integer = StringRegExpReplace($inp, "[^0-9]", "")
    GUICtrlSetData($Label4, "Hex: " & Integer2Hex($integer))
    GUICtrlSetData($Label5, "Oct: " & Integer2Octal($integer))
    GUICtrlSetData($Input, $integer)
    $b = Integer2Binary(Number($integer))
    $c = _StringReverse(StringRegExpReplace(_StringReverse($b), ".{1,4}", " $0"))
    GUICtrlSetData($Edit, StringLeft($c, StringLen($c) - 1))
    $sLen = StringLen(GUICtrlRead($Edit))
    Switch $sLen
    Case 0 To 4
    GUICtrlSetFont($Edit, 56, 400, 0, "Arial", 4)
    Case 5 To 8
    GUICtrlSetFont($Edit, 48, 400, 0, "Arial", 4)
    Case 9 To 12
    GUICtrlSetFont($Edit, 32, 400, 0, "Arial", 4)
    Case 13 To 16
    GUICtrlSetFont($Edit, 28, 400, 0, "Arial", 4)
    Case 17 To 32
    GUICtrlSetFont($Edit, 24, 400, 0, "Arial", 4)
    Case 33 To 50
    GUICtrlSetFont($Edit, 18, 400, 0, "Arial", 4)
    EndSwitch
    Case $Edit
    $inp = GUICtrlRead($Edit)
    $b = StringRegExpReplace($inp, "[^0-1]", "")
    $c = _StringReverse(StringRegExpReplace(_StringReverse($b), ".{1,4}", " $0"))
    GUICtrlSetData($Edit, StringLeft($c, StringLen($c) - 1))
    $int2 = Binary2Integer(String($b))
    GUICtrlSetData($Input, $int2)
    GUICtrlSetData($Label4, "Hex: " & Integer2Hex($int2))
    GUICtrlSetData($Label5, "Oct: " & Integer2Octal($int2))
    $sLen = StringLen(GUICtrlRead($Edit))
    Switch $sLen
    Case 0 To 6
    GUICtrlSetFont($Edit, 56, 400, 0, "Arial", 4)
    Case 7 To 12
    GUICtrlSetFont($Edit, 32, 400, 0, "Arial", 4)
    Case 13 To 31
    GUICtrlSetFont($Edit, 24, 400, 0, "Arial", 4)
    Case 32 To 50
    GUICtrlSetFont($Edit, 18, 400, 0, "Arial", 4)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func _WM_CARET($hWnd, $uiMsg, $wParam, $lParam)
    Local $Res = _WinAPI_CallWindowProc($hProc, $hWnd, $uiMsg, $wParam, $lParam)

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

    Switch $uiMsg
    Case $WM_SETFOCUS
    DllCall('user32.dll', 'int', 'CreateCaret', 'hwnd', $hWnd, 'ptr', $hBitmap, 'int', 0, 'int', 0)
    DllCall('user32.dll', 'int', 'ShowCaret', 'hwnd', $hWnd)
    DllCall('user32.dll', 'int', 'SetCaretBlinkTime', 'uint', $BlinkTime)
    Case $WM_KILLFOCUS
    DllCall('user32.dll', 'int', 'HideCaret', 'hwnd', $hWnd)
    DllCall('user32.dll', 'int', 'DestroyCaret')
    DllCall('user32.dll', 'int', 'SetCaretBlinkTime', 'uint', $BlinkTime_save[0])
    EndSwitch

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

    Return $Res
    EndFunc ;==>_WM_CARET

    [/autoit]

    Vielleicht kann das ja mal jemand gebrauchen...


    Gruß,
    UEZ

    2010-09-29: kleines Update -> die Integer Zahl wird jetzt auch nach Hex und Oktal umgewandelt und angezeigt
    2010-11-29: hatte vergessen, dass auch bei der Binäreingabe in Oktal umgerechnet wird -> sollte jetzt funzen
    2011-09-19: kleinere Modifikationen

  • Schönes Script! :thumbup:
    Aber vielleicht solltest Du das noch erweitern und die Binärwerte gruppieren (nach: Byte, Word, Long).

    Beispiel: 7568 = 1 1101 1001 0000


    Danke für dein Feedback. Ich habe den Code aktualisiert! Meinst du das so mit der Gruppierung?

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    • Offizieller Beitrag

    Ja, so meinte ich das. :thumbup:

    Ich hätte noch eine Idee für den Ausbau des Programms:
    Die Darstellung gruppiert ja jetzt nach Halbbytes (Nibbles). Diese werden in der Elektronik für die Ansteuerung von LED-(7-Segment-)Anzeigen verwendet.
    Wenn Du jetzt noch eine Anzeige/Umrechnung der Nibbles nach 7-Segment einbauen würdest, dann hätte man ein Programm, mit dem man die Byteausgabe mit der Anzeige vergleichen kann.
    Ganz praktisch für die Fehlerdiagnose.

    Falls Du das Programm noch erweitern möchtest...

  • Ja, so meinte ich das. :thumbup:

    Ich hätte noch eine Idee für den Ausbau des Programms:
    Die Darstellung gruppiert ja jetzt nach Halbbytes (Nibbles). Diese werden in der Elektronik für die Ansteuerung von LED-(7-Segment-)Anzeigen verwendet.
    Wenn Du jetzt noch eine Anzeige/Umrechnung der Nibbles nach 7-Segment einbauen würdest, dann hätte man ein Programm, mit dem man die Byteausgabe mit der Anzeige vergleichen kann.
    Ganz praktisch für die Fehlerdiagnose.

    Falls Du das Programm noch erweitern möchtest...

    Interessant wäre es schon, aber das würde über das Ziel hinausschießen! Würde nur Sinn machen, wenn die Möglichen 15 Zahlen auch als LED angezeigt werden könnten und dafür habe ich das kleine Tool nicht entworfen!

    Aber wer weiß....


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Du könntest die Umwandlung zu einer beliebigen Basis einbauen, oder zumindest die gängigen :D