Heim  >  Artikel  >  Backend-Entwicklung  >  Wie lese ich Binärdaten in Python?

Wie lese ich Binärdaten in Python?

PHPz
PHPznach vorne
2023-05-08 18:58:062073Durchsuche

Bytes

Bytes: Eine Art Zeichenfolge. Durch den Vergleich von dir(str) und dir(bytes) können wir erkennen, dass die Eigenschaften und Methoden der beiden sehr ähnlich sind und nur wenige Unterschiede aufweisen. Daher können Bytes auch verschiedene Operationsmethoden für Bytesequenzen wie Zeichenfolgen haben, z. B. Suchen (Finden), Länge (Len), Schneiden (Split), Slicing usw. Der Vorteil von

bytes ist: Die integrierte Python-Methode erfordert keine Installation zusätzlicher Module von Drittanbietern.

Aber der Nachteil liegt auch auf der Hand: Es kann nur eine einzelne Abfrage abgefragt werden und nicht mehrere erforderliche Ergebnisse gleichzeitig abfragen.

Öffnen Sie zunächst die Datei im RB-Modus und lesen Sie den Inhalt als Bytetyp. Es gibt eine find()-Methode zum Suchen einer bestimmten Zeichenfolge. Diese Methode kann jedoch nur den ersten Zeichenfolgenindex finden, der die Anforderungen erfüllt, und gibt keinen Einzelbit-Index, sondern einen 8-Bit-Einbyte-Index an. Wenn Sie mehrere übereinstimmende Zeichenfolgen finden müssen, gibt es keine integrierte findall()-Methode. Wenn Sie mehrere Abfragen durchführen möchten, ist der Vorgang mühsam. Suchen Sie zunächst den ersten übereinstimmenden Index 1, beginnen Sie mit diesem Index 1, fragen Sie den zweiten übereinstimmenden Index 2 ab und so weiter, bis die Abfrage abgeschlossen ist.

with open(path, 'rb') as f:
    datas = f.read()
    start_char = datas.find(b'Start')
    # start_char2 = datas.find(b'Start', start_char)
    end_char = datas.find(b'End', start_char)
    # end_char2 = datas.find(b'End', start_char2)
    data = datas[start_char:end_char]
    print(data)

Beachten Sie, dass start_char und end_char im obigen Code mehrmals vorkommen und die Zeiten nicht unbedingt gleich sind. Der Inhalt zwischen den beiden Indizes muss abgerufen werden, er kann jedoch nicht gleichzeitig wiederholt oder überprüft werden. Die kommentierte Codezeile muss mehrmals ausgeführt werden, um den Schlüsselwortindex zu erhalten. Da wir nicht wissen, wie viele Startflags in den Dateidaten enthalten sein werden, wissen wir nicht, wie oft sie ausgeführt werden. Dies sollte durch eine Schleife gelöst werden, aber es scheint keine Variable für die Schleife zu geben. Dadurch wird das Problem komplexer.

Zweitens muss der obige Vorgang zweimal durchgeführt werden, da der Inhalt zwischen den beiden Zeichen erhalten wird. Daher ist der Prozess noch komplizierter.

Daher ist es unbedingt notwendig, neue Methoden zu finden.

bitstring

bitstring ist ein Drittanbieterpaket, das Binärdateien in Form von Bytestreams liest.

Der erste Satz der Datei bitstring.py lautet: Dieses Paket definiert Klassen, die die bitweise Erstellung, Bearbeitung und Interpretation von Daten vereinfachen.

Die Übersetzung lautet wie folgt: Dieses Paket definiert Klassen, die die bitweise Erstellung und Bearbeitung vereinfachen und Interpretation von Daten erklären.

Das einfache Verständnis besteht darin, Daten vom Typ Byte direkt zu verarbeiten.

Es gibt vier Hauptklassen:

Bits – Ein unveränderlicher Container für Binärdaten.
BitArray – Ein veränderlicher Container für Binärdaten.
ConstBitStream – Ein unveränderlicher Container mit Streaming-Methoden.
BitStream – Ein veränderlicher Container mit Streaming-Methoden.

Bits – Ein unveränderlicher Container für Binärdaten.
BitArray – Veränderlicher Container für Binärdaten.
ConstBitStream – Unveränderlicher Container mit Stream-Methoden.
BitStream – Veränderbarer Container mit Stream-Methoden.

Wie bei Bytes lesen Sie zuerst den Dateiinhalt, suchen Sie den Schlüsselwortindex und schneiden Sie ihn in Scheiben, um den Dateninhalt zu erhalten.

# update at 2022/05/06 start
# from bistring import ConstBitStream, BitStream
from bitstring import ConstBitStream, BitStream
# update at 2022/05/06 end

hex_datas = ConstBitStream(filename=path)  # 读取文件内容
start_char = b'Start'
start_chars = hex_datas.findall(start_char, bytealigned=True)  # 一次找到全部符合的,返回一个生成器
start_indexs = []
for start_char in start_chars:
    start_indexs.append(start_char)

end_char = b'End'
end_indexs = []
for start_index in start_indexs:
    end_chars = hex_datas.find(end_char, start=start_index, bytealigned=True)  # 找到第一个符合的,返回元组
    for end_char in end_chars:
        end_indexs.append(end_char)

result = []
for i in range(min(len(start_indexs), len(end_indexs))):
    hex_data = hex_datas[start_indexs[i]:end_indexs[i]]
    str_data = BitStream.tobytes(hex_data).decode('utf-8')
    result.append(str_data)

Code-Analyse, importieren Sie zunächst die beiden erforderlichen Klassen: ConstBitStream, BitStream. Um den Dateiinhalt abzurufen, findet findall() alle passenden String-Indizes und find() den ersten passenden String-Index. Nehmen Sie den kleineren Wert der beiden Listen „Start“ und „Ende“ und erhalten Sie einen Datentyp. Die Methode BitStream.tobytes() konvertiert ihn in einen Byte-Typ, der verstümmelt wird decode() zum Dekodieren und Abrufen der erforderlichen Zeichenfolge.

Der gesamte Prozess ist einfach und kontinuierlich. Im Code werden die Methoden findall(), find() und tobytes() verwendet. Darüber hinaus gibt es viele kleine Details, die beachtet werden müssen. Wenn beispielsweise start_indexs leer ist, sollte nachfolgender Code nicht ausgeführt werden, und das Gleiche gilt für end_indexs, wenn er leer ist.

Es ist ersichtlich, dass das Bitstring-Paket relativ einfach zu verwenden ist. Je nach Bedarf werden relativ wenige Methoden verwendet. Tatsächlich gibt es viele andere Methoden, die je nach Bedarf ausgewählt werden können.

Das obige ist der detaillierte Inhalt vonWie lese ich Binärdaten in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen