Binär und Binärstrings

  • Da die Binary-Funktion von Autoit Hexadezimalstrings zurückgibt, habe ich Funktionen für Binärstrings und Zahlenerstellt (Ich gaube das hatte Autoit nich nicht)
    Villeicht kann es jemand gebrauchen

    Funktionen:

    Spoiler anzeigen
    [autoit]


    Func _Binary($str,$leerzeichen=True)
    Local $erg=""
    For $x=1 to StringLen($str)
    $erg&=decbin(Asc(StringMid($str,$x,1)),8)
    If $leerzeichen=1 Or $leerzeichen=True Then $erg&=" "
    Next
    Return $erg
    EndFunc

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

    Func _BinaryToString($str,$leerzeichen=-1)
    If $leerzeichen=-1 Then
    if StringInStr($str," ") Then
    $leerzeichen=1
    Else
    $leerzeichen=0
    EndIf
    EndIf
    Local $erg=""
    if $leerzeichen=1 Then
    If StringRight($str,1)=" " Then $str=StringTrimRight($str,1)
    Local $split=StringSplit($str," ")
    Local $stueck
    For $x=1 to $split[0]
    $stueck=$split[$x]
    If StringLen($stueck)<8 Or StringLen($stueck)>8 Then Return SetError(1,1,-1)
    $erg&=Chr(bindec($stueck))
    Next
    Else
    If Mod(StringLen($str),8)<>0 Then Return SetError(1,2,-1)
    Local $split[StringLen($str)/8]
    For $x=0 To UBound($split)-1
    $split[$x]=StringMid($str,($x*8)+1,8)
    Next
    For $stueck In $split
    $erg&=Chr(bindec($stueck))
    Next
    EndIf
    Return $erg
    EndFunc

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

    Func decbin($str,$len=0)
    $str=Int($str)
    If $len<0 Then Return -1
    If $str=0 Then Return 0
    Local $erg=""
    Local $tmpbin=""
    Local $start=1
    While $start<$str
    $start*=2
    WEnd
    While 1
    If $start<1 Then Return SetError(1,1,-2)
    If $str>=$start Then
    $tmpbin&="1"
    $str-=$start
    Else
    $tmpbin&="0"
    EndIf
    If $str<=0 Then ExitLoop
    $start/=2
    WEnd
    While $start>1
    $tmpbin&="0"
    $start/=2
    WEnd
    While StringLeft($tmpbin,1)="0"
    $tmpbin=StringMid($tmpbin,2)
    WEnd
    If $len<>0 Then
    If $len>StringLen($tmpbin) Then
    $tmpbin=umdrehen($tmpbin)
    For $x=StringLen($tmpbin)+1 To $len
    $tmpbin&="0"
    Next
    $tmpbin=umdrehen($tmpbin)
    ElseIf $len<StringLen($tmpbin) Then
    $tmpbin=umdrehen($tmpbin)
    $tmpbin=StringMid($tmpbin,1,$len)
    $tmpbin=umdrehen($tmpbin)
    EndIf
    EndIf
    $erg=$tmpbin
    Return $erg
    EndFunc

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

    Func bindec($str)
    Local $erg=0
    Local $tmp=1
    $str=umdrehen($str)
    For $x=1 To StringLen($str)
    If StringMid($str,$x,1)="1" Then $erg+=$tmp
    $tmp*=2
    Next
    Return $erg
    EndFunc

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

    Func umdrehen($str)
    Local $erg=""
    For $x=StringLen($str) To 1 Step -1
    $erg&=StringMid($str,$x,1)
    Next
    Return $erg
    EndFunc

    [/autoit]

    Minibeispiel:

    [autoit]


    $str=_Binary("Hallo")
    MsgBox(0,"",$str)
    $str=_BinaryToString($str)
    MsgBox(0,"",$str)

    [/autoit]
  • Genau diese Func hab ich aus Spass vor 2 Tagen auch gecoded ;)
    Wenn du willst, kannst du ja mal einen Speedvergleich durchführen 8)

    Spoiler anzeigen
    [autoit]


    #include <array.au3>
    #include <String.au3>

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

    Func _StringToBinary($sString)
    Local $Return = ""
    Local $a
    $a = StringSplit(_StringToHex($sString), "")
    For $i = 1 To $a[0] Step +1
    Switch $a[$i]
    Case "0"
    $Return &= "0000"
    Case "1"
    $Return &= "0001"
    Case "2"
    $Return &= "0010"
    Case "3"
    $Return &= "0011"
    Case "4"
    $Return &= "0100"
    Case "5"
    $Return &= "0101"
    Case "6"
    $Return &= "0110"
    Case "7"
    $Return &= "0111"
    Case "8"
    $Return &= "1000"
    Case "9"
    $Return &= "1001"
    Case "A"
    $Return &= "1010"
    Case "B"
    $Return &= "1011"
    Case "C"
    $Return &= "1100"
    Case "D"
    $Return &= "1101"
    Case "E"
    $Return &= "1110"
    Case "F"
    $Return &= "1111"
    EndSwitch
    Next
    Return $Return
    EndFunc ;==>_StringToBinary

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

    Func _BinaryToString($sString)
    Local $Return = ""
    Local $a
    $a = StringRegExp($sString, '.{1,4}', 3)
    For $i = 0 To uBound($a)-1 Step +1
    Switch $a[$i]
    Case 0000
    $Return &= "0"
    Case 0001
    $Return &= "1"
    Case 0010
    $Return &= "2"
    Case 0011
    $Return &= "3"
    Case 0100
    $Return &= "4"
    Case 0101
    $Return &= "5"
    Case 0110
    $Return &= "6"
    Case 0111
    $Return &= "7"
    Case 1000
    $Return &= "8"
    Case 1001
    $Return &= "9"
    Case 1010
    $Return &= "A"
    Case 1011
    $Return &= "B"
    Case 1100
    $Return &= "C"
    Case 1101
    $Return &= "D"
    Case 1110
    $Return &= "E"
    Case 1111
    $Return &= "F"
    EndSwitch
    Next
    $Return = _HexToString($Return)
    Return $Return
    EndFunc ;==>_BinaryToString

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

    $Blub = _BinaryToString(_StringToBinary("Test ^^"))
    msgbox(0,"",$Blub)

    [/autoit]
  • Ich finde, da sind meine Funktionen [manche kürzer] eleganter :P

    Eleganter ist sie allemal,
    allerdings hatte ich auch vorher überlegt ob ichs nicht so machen will wie du, aber da schien mir meine Methode vom Aufbau her simpler ;)
    Mich würd halt mal interessieren was schnell ist, ich teste es vll morgen mal wenn ich zeit hab

  • Ich hab auch etwas vorbereitet ^^ (meine Variante ist kürzer, aber ob sie schneller ist weiss ich nicht)

    Spoiler anzeigen
    [autoit]

    Func BinaryConvert($in, $mode = 1)
    Local $n[4] = [0, 0, 0, 0], $asc = 0
    Switch $mode
    Case 1
    $asc = Asc($in) - 48
    If $asc > 9 Then $asc -= 7
    For $i = 3 To 0 Step -1
    If Not (2 ^ $i > $asc) Then
    $asc -= 2 ^ $i
    $n[$i] = 1
    EndIf
    Next
    Return $n[3] & $n[2] & $n[1] & $n[0]
    Case 2
    $in = StringSplit($in, "", 2)
    For $i = 0 To 3
    If $in[$i] = 1 Then $asc += 2 ^ (3 - $i)
    Next
    If $asc > 9 Then Return Chr($asc + 55)
    Return $asc
    EndSwitch
    EndFunc ;==>BinaryConvert (HEX-Ziffern) by XovoxKingdom

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

    MsgBox(0, BinaryConvert("1010", 2), BinaryConvert("A"))

    [/autoit]


    EDIT: Soo.. jetzt stimmt auch die Formatierung :D

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

    3 Mal editiert, zuletzt von XovoxKingdom (16. April 2010 um 15:24)

  • Deine Variante kann ja immer nur ein Zeichen in Binär umwandeln, bzw zurück :(

  • Meine voherige Version hat nur Hex-Ziffern umgewandelt (0-9 A-F)..

    die jetzige sollte das gewünschte können:

    Spoiler anzeigen
    [autoit]

    Func BinaryConvert($in, $mode = 1)
    Local $b, $result, $max = StringLen($in) / 8 - 1
    Switch $mode
    Case 1
    For $x = 1 To StringLen($in)
    $a = Asc(StringMid($in, $x, 1))
    For $i = 7 To 0 Step -1
    If Mod($a, 2 ^ $i) < $a Then
    $b &= 1
    $a -= 2 ^ $i
    Else
    $b &= 0
    EndIf
    Next
    Next
    Return $b
    Case 2
    For $x = 0 To $max
    $a = StringMid($in, $x * 8 + 1, 8)
    $b = 0
    For $i = 7 To 0 Step -1
    If StringMid($a, 8 - $i, 1) = "1" Then $b += 2 ^ $i
    Next
    $result &= Chr($b)
    Next
    Return $result
    EndSwitch
    EndFunc ;==>BinaryConvert by XovoxKingdom
    MsgBox(0, BinaryConvert("01000001010000100100001001000001", 2), BinaryConvert("ABBA"));Beispiel

    [/autoit]

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!