binär suchen (mit re?)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Samstag 5. März 2005, 20:48

Hi

Wie kann ich einfach nach 11 gesetzten Bits nacheinander suchen?
also Binär: 1111 1111 111x xxxx (für x 0 oder 1) insgesammt 2 Bytes.


Geht sowas mit regex? Wenn ja wie ist der Ansatz dazu?

Danke vielmals

Gruss
BlackJack

Samstag 5. März 2005, 22:47

Reguläre Ausdrücke suchen nach Zeichen, also auf Bytes.

Kommen die 11 Bits so vor wie Du sie beschrieben hast, also ein Byte mit allen Bits gesetzt und im Nächsten dann die obersten 3 gesetzt, oder kann die Bitfolge auch noch innerhalb der Bytes verschoben sein?

Wenn sie nicht verschoben sind, dann kannst Du nach einem Byte mit dem Wert '\xFF' mit `str.find()` oder `str.index()` suchen und musst im nächsten Byte nur noch testen ob die obersten 3 Bits gesetzt sind. Entweder mit `&` die unteren ausmaskieren und testen ob die Maske übrig geblieben ist. Ungetestet:

Code: Alles auswählen

def find_11_bits(data):
    pos = data.find('\xFF')
    if pos != -1:
        if pos + 1 == len(data):
            return -1
        mask = int('11100000', 2)
        tmp = ord(data[pos + 1]) & mask
        if tmp != mask:
            return -1
    return pos
Sollte die Bitfolge finden und die Position des ersten Bytes zurückgeben oder -1 falls die Bitfolge nicht enthalten ist.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Samstag 5. März 2005, 22:50

Ja sind nicht verschoben. Ist ein Anfang von einem Header.
Ich werde deine Version gleich mal durchdenken und ausprobieren.

Danke
Gast

Samstag 5. März 2005, 23:00

BlackJack hat geschrieben:Reguläre Ausdrücke suchen nach Zeichen, also auf Bytes.
Wobei das schon geht:

Code: Alles auswählen

import re
data = "asdf\xff\xeeee\xff\xf9s"
res = re.findall(r"\xff[\xe0-\xff]",data)
for r in res:
    print r[1] # Ausgabe des Zeichens hinterm \xff
joe
BlackJack

Sonntag 6. März 2005, 23:33

Geht natürlich auch. Man muss aus Deinem Beispiel aber das 'r' vor dem Muster weglassen. Sonst haben die '\xff' und '\xe0' nicht die Bedeutung, die sie haben sollen.  ;-)
Antworten