Binär - aber richtig

  • Hi leute

    ich wollt mal wissen, ob es in autoit eine möglichkeit gibt, Binärstrings o.ä. sich richtig anzeigen zu lassen.
    weil mit der normalen StringToBinary() Funktion wird es ja iwie in Hex dargestellt.

    Meine Idee wäre gewesen das über ne switsch abfrage laufen zu lassen falls noch keiner sowas gemacht hat...
    Aber kenn einer vl ne seite wo alle Buchstaben und ggf. Zahlen als Binär aufgelistet sind(also Zahlen sind nicht unbedingt erforderlich, würd ich auch so hinbekommen...

    danke im vorraus
    lg Max

    Einmal editiert, zuletzt von MM TOP-POL (20. September 2011 um 22:24)

  • ja für zahlen is der link auch gut, aber halt für die buchstaben bräucht ich eher was
    mir reicht da ja ne liste...

  • [autoit]

    Func _Bit($iNumber)
    Local $iReturn, $i
    Do
    $iReturn = Mod($iNumber, 2) & $iReturn
    $iNumber = Floor($iNumber / 2)
    Until $iNumber = 0
    Return $iReturn
    EndFunc ;==>_Bit

    [/autoit]
  • Wie wärs damit?

    Spoiler anzeigen
    [autoit]

    ConsoleWrite(_StringToBinary_ForReal("test") & @CRLF)

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

    Func _StringToBinary_ForReal($sString)
    $sRet = ""
    For $i = 1 To StringLen($sString)
    $sRet &= StringFormat("%08s", _Convert_To_Binary(AscW(StringMid($sString, $i, 1))))
    Next
    Return $sRet
    EndFunc

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

    Func _Convert_To_Binary($iNumber)
    Local $sBinString = ""
    While $iNumber
    $sBinString = BitAND($iNumber, 1) & $sBinString
    $iNumber = BitShift($iNumber, 1)
    WEnd
    Return $sBinString
    EndFunc ;==>_Convert_To_Binary

    [/autoit]
  • Was stellst du dir denn unter "Buchstaben binär ausgeben" denn genau vor.
    Prinzipiell ist das ja eigentlich nur der Zahlenwert der Position an der das Zeichen in der ASCII/ANSI-Tabelle steht binär umgewandelt:

    Beispiel
    [autoit]

    #include <Array.au3>

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

    ; Einzelne Buchstaben:
    For $i = 65 To 90
    $s_Char = ChrW($i)
    $s_CharValueAsNumber = Int(StringToBinary($s_Char))
    ConsoleWrite($s_Char & @TAB & $i & @TAB & StringToBinary($s_Char) & @TAB & _Convert_To_Binary($s_CharValueAsNumber) & @CRLF)
    Next

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

    ; Ganzer String:
    Global $Teststring = "Dies ist mein TestString!"
    For $i In StringToASCIIArray($Teststring)
    ConsoleWrite(_Convert_To_Binary($i) & @CRLF)
    Next

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

    Func _Convert_To_Binary($iNumber)
    ; by picaxe
    Local $sBinString = ""
    Do
    $sBinString = BitAND($iNumber, 1) & $sBinString
    $iNumber = BitShift($iNumber, 1)
    Until $iNumber <= 0
    If $iNumber < 0 Then SetError(1, 0, 0)
    Return $sBinString
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (20. September 2011 um 22:17)

  • funktionieren tun auf jedenfall beide sachen und auch schon mal danke dafür,
    ich denk mal ich werdden code con AspirinJunkie nehmen, da ich es auch so nach einzelnen buchstaben haben wollte :)

    aber dein script name22 werd ich auch auf jden fall mal im anschlag lassen

  • Wenn es ein wenig aufs Tempo ankommt habe ich auch eine recht schnelle Methode zum Umwandeln entdeckt. (eben etwas gebastelt)

    StringToBin arbeitet im Rekordgempo (wenige µs bis ms bei kurzen Texten)
    BinToString braucht leider etwas Zeit... (ca. 2ms beim Testtext)

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $a[256]
    _ArrayFuellen()

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

    Local $t ; Timer
    Local $s = 'Hallo liebe Leute. Was ist los ? Hier muss ganz viel Text stehen, damit die Umwandlung lange dauert.'
    Local $r

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

    ConsoleWrite($s & @CRLF & '_StringToBin')
    $t = TimerInit()
    $r = _StringToBin($s)
    $t = TimerDiff($t)
    ConsoleWrite(@CRLF & $r & @CRLF & Round($t*1000) & ' µs' & @CRLF)

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

    ConsoleWrite(@CRLF & '_BinToString')
    $t = TimerInit()
    $r = _BinToString($r)
    $t = TimerDiff($t)
    ConsoleWrite(@CRLF & $r & @CRLF & Round($t*1000) & ' µs' & @CRLF)

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

    Func _StringToBin($sS) ; String rein, Nullen und Einsen raus !
    Local $sH = StringTrimLeft(StringToBinary($sS), 2), $sR
    For $i = 1 To StringLen($sS) * 2 Step 2 ; 1 Zeichen -> 2 Hex
    $sR &= $a['0x' & StringMid($sH, $i,2)]
    Next
    Return $sR
    EndFunc

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

    Func _BinToString($sB) ; Nullen und Einsen rein, String raus !
    Local $sH, $iL = StringLen($sB)
    For $i = 1 To $iL Step 8 ; 1 Zeichen -> 8 Bit
    $sH &= _BinToDec(StringMid($sB, $i,8))
    Next
    Return BinaryToString('0x' & $sH)
    EndFunc

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

    Func _DecToBin($iD) ; Modulomethode -> Nicht sehr schnell. Unwichtig, da sie nur zum Initialisieren von 0 bis 255 genutzt wird.
    Local $sR
    Do
    $sR = Mod($iD, 2) & $sR
    $iD = Floor($iD / 2)
    Until $iD = 0
    Return StringRight('0000000' & $sR, 8) ; Es werden 8 Stellen ausgegeben !
    EndFunc ;==>_DecToBin_7

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

    Func _ArrayFuellen() ; Damit alle Werte von 0 bis 255 direkt vorliegen und keine Berechnungen nötig sind.
    For $i = 0 To 255 Step 1
    $a[$i] = _DecToBin($i)
    Next
    EndFunc

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

    Func _BinToDec($sB) ; Sehr unelegante Methode um von 8 Bit nach 2 Hex zu kommen.
    Local $sH = ''
    Switch StringLeft($sB, 4)
    Case '0000'
    $sH &= '0'
    Case '0001'
    $sH &= '1'
    Case '0010'
    $sH &= '2'
    Case '0011'
    $sH &= '3'
    Case '0100'
    $sH &= '4'
    Case '0101'
    $sH &= '5'
    Case '0110'
    $sH &= '6'
    Case '0111'
    $sH &= '7'
    Case '1000'
    $sH &= '8'
    Case '1001'
    $sH &= '9'
    Case '1010'
    $sH &= 'A'
    Case '1011'
    $sH &= 'B'
    Case '1100'
    $sH &= 'C'
    Case '1101'
    $sH &= 'D'
    Case '1110'
    $sH &= 'E'
    Case '1111'
    $sH &= 'F'
    EndSwitch
    Switch StringRight($sB, 4)
    Case '0000'
    $sH &= '0'
    Case '0001'
    $sH &= '1'
    Case '0010'
    $sH &= '2'
    Case '0011'
    $sH &= '3'
    Case '0100'
    $sH &= '4'
    Case '0101'
    $sH &= '5'
    Case '0110'
    $sH &= '6'
    Case '0111'
    $sH &= '7'
    Case '1000'
    $sH &= '8'
    Case '1001'
    $sH &= '9'
    Case '1010'
    $sH &= 'A'
    Case '1011'
    $sH &= 'B'
    Case '1100'
    $sH &= 'C'
    Case '1101'
    $sH &= 'D'
    Case '1110'
    $sH &= 'E'
    Case '1111'
    $sH &= 'F'
    EndSwitch
    Return $sH
    EndFunc

    [/autoit]

    Edit:
    Ich habe nochmals etwas geschaut und musste leider Feststellen, dass das nutzen einer Dllstruct mit den Stringnamen als Elementname wesentlich langsamer ist als ich erwartet habe. deshalb nur eine leicht Abgeänderte Version (die ca. 50% schneller ist) der bisherigen.
    Das Umwandeln vom String in Binärzahlen geht immernoch wesentlich flotter als der andere Weg...

    Hier mal ein angepasstes Skript aus der Hilfe. (Das war glaube ich mal zum Verschlüsseln oder so)

    Spoiler anzeigen
    [autoit]


    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <WinApi.au3>

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

    Global $a[256]
    _ArrayFuellen()

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

    $hWnd=GUICreate('Echtzeit Umwandlung',600,300,-1)
    $hInputEdit=GUICtrlCreateEdit('',0,0,600,150,$ES_WANTRETURN+$ES_AUTOVSCROLL)
    $hOutputEdit=GUICtrlCreateEdit('',0,150,600,135,$ES_READONLY+$ES_AUTOVSCROLL)
    GUICtrlSetFont(-1, 6, 400, 0 , 'Courier New', 5)
    $hLabel = GUICtrlCreateLabel('', 5, 285, 600, 15)
    GUIRegisterMsg($WM_COMMAND,"WM_COMMAND")
    GUISetState(@SW_SHOW)

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

    While Not (GUIGetMsg() = -3)
    WEnd

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

    Func WM_COMMAND($hWinHandle,$iMsg,$wParam,$lParam)
    Local $t
    If _WinAPI_HiWord($wParam)=$EN_CHANGE And _WINAPI_LoWord($wParam)=$hInputEdit Then
    Local $read = GUICtrlRead($hInputEdit)
    If Not StringReplace(StringReplace($read, '0', ''), '1', '') Then
    $t = TimerInit()
    $bEncrypted=_BinToString($read)
    $t = TimerDiff($t)
    GUICtrlSetData($hOutputEdit,$bEncrypted)
    GUICtrlSetData($hLabel, '_BinToString - ' & Round($t*1000) & ' µs')
    Else
    $t = TimerInit()
    $bEncrypted=_StringToBin($read)
    $t = TimerDiff($t)
    GUICtrlSetData($hLabel, '_StringToBin - ' & Round($t*1000) & ' µs')
    GUICtrlSetData($hOutputEdit,$bEncrypted)
    EndIf
    EndIf
    EndFunc

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

    Func _StringToBin($s) ; String rein, Nullen und Einsen raus !
    Local $h = StringTrimLeft(StringToBinary($s), 2), $r
    For $i = 1 To StringLen($s) * 2 Step 2 ; 1 Zeichen -> 2 Hex
    $r &= $a['0x' & StringMid($h, $i, 2)]
    Next
    Return $r
    EndFunc ;==>_StringToBin

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

    Func _BinToString($b) ; Nullen und Einsen rein, String raus !
    Local $s
    For $i = 1 To StringLen($b) Step 8 ; 1 Zeichen -> 8 Bit
    Switch Int(StringMid($b, $i, 4))
    Case 0
    $s &= '0'
    Case 1
    $s &= '1'
    Case 10
    $s &= '2'
    Case 11
    $s &= '3'
    Case 100
    $s &= '4'
    Case 101
    $s &= '5'
    Case 110
    $s &= '6'
    Case 111
    $s &= '7'
    Case 1000
    $s &= '8'
    Case 1001
    $s &= '9'
    Case 1010
    $s &= 'A'
    Case 1011
    $s &= 'B'
    Case 1100
    $s &= 'C'
    Case 1101
    $s &= 'D'
    Case 1110
    $s &= 'E'
    Case 1111
    $s &= 'F'
    EndSwitch
    Switch Int(StringMid($b, $i+4, 4))
    Case 0
    $s &= '0'
    Case 1
    $s &= '1'
    Case 10
    $s &= '2'
    Case 11
    $s &= '3'
    Case 100
    $s &= '4'
    Case 101
    $s &= '5'
    Case 110
    $s &= '6'
    Case 111
    $s &= '7'
    Case 1000
    $s &= '8'
    Case 1001
    $s &= '9'
    Case 1010
    $s &= 'A'
    Case 1011
    $s &= 'B'
    Case 1100
    $s &= 'C'
    Case 1101
    $s &= 'D'
    Case 1110
    $s &= 'E'
    Case 1111
    $s &= 'F'
    EndSwitch
    Next
    Return BinaryToString('0x' & $s)
    EndFunc ;==>_BinToString

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

    Func _DecToBin($iD) ; Modulomethode -> Nicht sehr schnell. Unwichtig, da sie nur zum Initialisieren von 0 bis 255 genutzt wird.
    Local $sR
    Do
    $sR = Mod($iD, 2) & $sR
    $iD = Floor($iD / 2)
    Until $iD = 0
    Return StringRight('0000000' & $sR, 8) ; Es werden 8 Stellen ausgegeben !
    EndFunc ;==>_DecToBin

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

    Func _ArrayFuellen() ; Damit alle Werte von 0 bis 255 direkt vorliegen und keine Berechnungen nötig sind.
    For $i = 0 To 255 Step 1
    $a[$i] = _DecToBin($i)
    Next
    EndFunc ;==>_ArrayFuellen

    [/autoit]

    lg
    Mars(i)