Bit.au3 | Bitweise arbeiten mit AutoIt

  • Hallo Community! :)
    Da ich mich in den letzten Tagen extrem mit Datenkompression Algorithmen beschäfftigt habe, sind ein Paar Funktionen entstanden die mir bei der Datenkompression auf Bit Ebene helfen sollten. Ich finde die Funktionen sind es Wert in eine UDF zusammen geschrieben zu werden da sie doch das eine oder andere Kopfrechnen abnehmen. Am besten schaut ihr euch die Funktionsbeschreibungen selber an (welche auf Deutsch geschrieben sind) und seht was diese alles kann. Hier eine Liste mit allen Funktionen:

    Code
    _Bit($iInteger, $iBit)
    _BitSet($iInteger, $iBit, $bState)
    _LoX($iInteger, $iBit)
    _HiX($iInteger, $iBit)
    _DecToDual($iInteger, $iBit)
    _DualToDec($sDual)
    _StringToBitArr($sString, $iBit = 8)
    _BitArrToString($aiArray)
    _HexToBitArray($sHex, $iBit = 8)
    _BitArrToHex($aiArray)

    Hier die UDF: (Auf Error Ausgaben wurde verzichtet)

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _Bit
    ; Beschreibung ..: Gibt den Status eines Bits in einer Ganzzahl wieder
    ; Syntax ........: _Bit($iInteger, $iBit)
    ; Parameters ....: $iInteger - Die zu verwendende Ganzzahl
    ; $iBit - Die zu prüfende Bit Position (1 bis 32/64)
    ; Rückgabewerte .: 0 - Bit ist nicht gesetzt
    ; 1 - Bit ist gesetzt
    ; Autor .........: Make-Grafik
    ; ===============================================================================================================================
    Func _Bit($iInteger, $iBit)
    Return Int(BitAND($iInteger, BitShift(1, ($iBit -1) * -1)) <> 0)
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _BitSet
    ; Beschreibung ..: Setzt den Status eines Bits in einer Ganzzahl
    ; Syntax ........: _BitSet($iInteger, $iBit, $bState)
    ; Parameters ....: $iInteger - Die zu verwendene Ganzzahl
    ; $iBit - Den zu setzenden Bit (1 bis 32/64)
    ; $bState - Den Status des zu setzenden Bits
    ; Rückgabewerte .: Die neue entstandene Ganzzahl
    ; Autor .........: Make-Grafik
    ; ===============================================================================================================================
    Func _BitSet($iInteger, $iBit, $bState)
    If $bState Then Return BitOR($iInteger, BitShift(1, ($iBit -1) * -1))
    Return BitAND($iInteger, BitNOT(BitShift(1, ($iBit -1) * -1)))
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _LoX
    ; Beschreibung ..: Gibt das niedere Byte, Word oder Dword einer Ganzzahl zurück
    ; Syntax ........: _LoByte($iInteger, $iBit)
    ; Parameters ....: $iInteger - Die zu verwendene Ganzzahl
    ; $iBit - Gibt die Anzahl der Bits der Ganzzahl an
    ; Rückgabewerte .: Das niedere Byte, Word oder Dword als Ganzzahl
    ; Autor .........: Make-Grafik
    ; ===============================================================================================================================
    Func _LoX($iInteger, $iBit)
    If $iBit = 16 Then Return BitAND($iInteger, 0xff)
    If $iBit = 32 Then Return BitAND($iInteger, 0xffff)
    If $iBit = 64 Then Return BitAND($iInteger, 0xffffffff)
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _HiByte
    ; Bschreibung ...: Gibt das obere Byte, Word oder Dword einer Ganzzahl zurück
    ; Syntax ........: _HiByte($iInteger, $iBit)
    ; Parameters ....: $iInteger - Die zu verwendene Ganzzahl
    ; $iBit - Gibt die Anzahl der Bits der Ganzzahl an
    ; Rückgabewerte .: Das obere Byte, Word oder Dword als Ganzzahl
    ; Autor .........: Make-Grafik
    ; ===============================================================================================================================
    Func _HiX($iInteger, $iBit)
    If $iBit = 16 Then Return BitAND(BitShift($iInteger, 8), 0xff)
    If $iBit = 32 Then Return BitAND(BitShift($iInteger, 16), 0xffff)
    If $iBit = 64 Then Return BitAND(BitShift($iInteger, 32), 0xffffffff)
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _DecToDual
    ; Bschreibung ...: Konvertiert eine Ganzzahl ins Dualsystem
    ; Syntax ........: _DecToDual($iInteger[, $iBit = 8])
    ; Parameters ....: $iInteger - Die zu konvertierende Ganzzahl
    ; $iBit - Anzahl der auszugebenden Bits
    ; Rückgabewert ..: Die konvertierte Ganzzahl im Dualsystem
    ; Autor .........: Make-Grafik
    ; ===============================================================================================================================
    Func _DecToDual($iInteger, $iBit)
    Local $i, $sDual

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

    For $i = $iBit To 1 Step -1
    $sDual &= _Bit($iInteger, $i)
    Next

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

    Return $sDual
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _DualToDec
    ; Bschreibung ...: Konvertiert eine Zahl im Dualsystem in eine Ganzzahl
    ; Syntax ........: _DualToDec($sDual)
    ; Parameters ....: $sDual - Die zu konvertierende Zahl im Dualsystem
    ; Rückgabewerte .: Die konvertierte Zahl im Dualsystem als Ganzzahl
    ; Autor .........: Make-Grafik
    ; ===============================================================================================================================
    Func _DualToDec($sDual)
    Local $iBit = StringLen($sDual)
    Local $i, $iDec

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

    For $i = 1 To $iBit
    $iDec += Int(StringMid($sDual, $iBit +1 -$i, 1)) * 2 ^ ($i -1)
    Next

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

    Return Int($iDec)
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _StringToBitArr
    ; Beschreibung ..: Konvertiert ein String in ein Array welches die Zeichen im Dualsystem abspeichert
    ; Syntax ........: _StringToBitArr($sString[, $iBit = 8])
    ; Parameters ....: $sString - Der zu konvertierende String
    ; $iBit - [optional] Anzahl der Bits pro Array Element
    ; Rückgabewerte .: Das Array mit den Dualwerten
    ; Autor .........: Make-Grafik
    ; ===============================================================================================================================
    Func _StringToBitArr($sString, $iBit = 8)
    Local $aiAscii = StringToASCIIArray($sString)
    Local $i, $n, $sDual

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

    For $i = 0 To UBound($aiAscii) -1
    $sDual &= _DecToDual($aiAscii[$i], 8)
    Next

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

    Return StringRegExp($sDual, '[01]{1,' & $iBit & '}', 3)
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _BitArrToString
    ; Beschreibung ..: Erstellt aus einem Array welches Dualwerte beinhaltet einen String
    ; Syntax ........: _BitArrToString($aiArray)
    ; Parameters ....: $aiArray - Das zu konvertierende Array
    ; Rückgabewerte .: Der String aus den Dualwerten
    ; Autor .........: Make-Grafik
    ; ===============================================================================================================================
    Func _BitArrToString($aiArray)
    Local $i, $sDual, $avAscii

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

    For $i = 0 To UBound($aiArray) -1
    $sDual &= $aiArray[$i]
    Next

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

    $avAscii = StringRegExp($sDual, '[01]{8}', 3)
    For $i = 0 To UBound($avAscii) -1
    $avAscii[$i] = _DualToDec($avAscii[$i])
    Next

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

    Return StringFromASCIIArray($avAscii)
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _HexToBitArr
    ; Beschreibung ..: Erstellt aus Binärdaten ein Array mit Dualwerten
    ; Syntax ........: _HexToBitArr($sHex[, $iBit = 8])
    ; Parameters ....: $sHex - Die zu konvertierende Binärdaten
    ; $iBit - [optional] Anzahl der Bits pro Array Element
    ; Rückgabewerte .: Das Array mit den Dualwerten
    ; Autor .........: Make-Grafik
    ; ===============================================================================================================================
    Func _HexToBitArr($sHex, $iBit = 8)
    Local $asHex = StringRegExp($sHex, '[0-9A-F]{2}', 3)
    Local $i, $n, $sDual

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

    For $i = 0 To UBound($asHex) -1
    $sDual &= _DecToDual(Dec($asHex[$i]), 8)
    Next

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

    Return StringRegExp($sDual, '[01]{1,' & $iBit & '}', 3)
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _BitArrToHex
    ; Beschreibung ..: Erstellt aus einem Array welches Dualwerte beinhaltet Binärdaten
    ; Syntax ........: _BitArrToHex($aiArray)
    ; Parameters ....: $aiArray - Das zu konvertierende Array
    ; Rückgabewerte .: Die Binärdaten aus den Dualwerten
    ; Autor .........: Make-Grafik
    ; ===============================================================================================================================
    Func _BitArrToHex($aiArray)
    Local $i, $sDual, $asHex, $sHex

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

    For $i = 0 To UBound($aiArray) -1
    $sDual &= $aiArray[$i]
    Next

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

    $asHex = StringRegExp($sDual, '[01]{4}', 3)
    For $i = 0 To UBound($asHex) -1 Step 2
    $sHex &= Hex(_DualToDec($asHex[$i] & $asHex[$i +1]), 2)
    Next

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

    Return '0x' & $sHex
    EndFunc

    [/autoit]

    Ich weiß nicht ob es ähnliche Funktionen hier irgendwo gibt.
    Als ich sie schrieb hatte ich keinen Internetzugang um danach zu googeln.
    Vielleicht kann ja der eine oder andere Funktionen daraus gebrauchen.

    Ich wünsche viel Spaß und würde mich über Rückmeldungen freuen. :)

    Einmal editiert, zuletzt von Yjuq (3. Juni 2013 um 22:11) aus folgendem Grund: Bei _Bit() einen Rechtschreibfehler entfernt.

  • Sieht nett aus, muss mich mal damit ein wenig rumspielen. ^^

    MfG

    P.S.: Guck dir mal die Funktionsbeschreibung von _Bit() an, da hast einen kleinen Tippfehler eingebaut. ;)

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski