Zugriff auf bitfields beim Lesen/schreiben von binären Daten Strukturen
Schreibe ich einen parser für das binäre format. Dieses binäre format besteht aus verschiedenen Tabellen, die wiederum in binäre format mit unterschiedlichen Feldgrößen in der Regel (irgendwo zwischen 50 - 100).
Meisten dieser Strukturen bitfields und werden ähnlich Aussehen wie diese, wenn dargestellt in C:
struct myHeader
{
unsigned char fieldA : 3
unsigned char fieldB : 2;
unsigned char fieldC : 3;
unsigned short fieldD : 14;
unsigned char fieldE : 4
}
Stieß ich auf das struct-Modul, merkte aber an, dass die niedrigste Auflösung war ein byte und nicht ein bit, sonst ist das Modul ziemlich viel war das Recht fit für diese Arbeit.
Ich weiß bitfields werden unterstützt, mithilfe von ctypes, aber ich bin mir nicht sicher, wie das interface ctypes Strukturen mit bitfields hier.
Meine andere option ist, manipulieren die bits selbst und Speisen ihn in bytes und verwenden Sie es mit dem struct-Modul - da habe ich aber in der Nähe 50-100 verschiedene Arten von solchen Strukturen, die den code schreiben, für das wird mehr fehleranfällig. Ich bin auch besorgt über die Effizienz, da dieses Werkzeug könnte verwendet werden, um zu analysieren, große Gigabyte von binären Daten.
Dank.
- es gibt auch 3rd-party-bit-array / bit manipulation Bibliotheken.
- Es wäre ziemlich viel Arbeit, aber man könnte wahrscheinlich entwerfen eine Klasse, die könnte parse C-Stil-Struktur-Definitionen (oder etwas ähnliches zu Ihnen eliminiert, dass die Verpackung Mehrdeutigkeit) in einen Satz von Masken, die für jedes Bitfeld, Lesen Sie die Daten über das struct-Modul zu erhalten, um die byte-Ebene, und bieten
__getattr__
Zugang. - Ja ich kam jetzt über diese tools - python-bitstring, Construct, BitReader - und ein Blick in die docs. Bit-Leser scheint wie eine gute Lösung, aber ich sehe hier, dass die Leistung ist gonna be ein großer hit. Bauen soweit ich finden konnte, von Ihrer grundlegenden Dokumentation doesnt support-bit-Felder. Python-bitstring klingt vielversprechend und müssen in Graben etwas tiefer
- ja Russell, das ist meine Letzte alternative, da der inzwischen so etwas wie eine höhere Ebene der Abstraktion zu unterstützen bitfields mit der struct-Modul.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit bitstring (die Sie erwähnen, sind Sie auf der Suche auf) es sollte einfach genug zu implementieren. Zuerst erstellen Sie einige Daten zu Dekodieren:
Und dann decodieren Sie wieder nur
Ihre größte Sorge könnte auch der Geschwindigkeit. Die Bibliothek ist gut optimiert Python, aber das ist nicht annähernd so schnell wie eine C-Bibliothek wäre.
Habe ich noch nicht intensiv getestet, aber es scheint zu funktionieren mit unsigned-Typen (edit: es funktioniert mit signed byte/short-Typen, auch).
Edit 2: Das ist wirklich hit oder miss. Es hängt von der Art der Bibliothek-compiler verpackt die bits in der Struktur, die nicht standardisiert ist. Zum Beispiel mit gcc 4.5.3 es funktioniert so lange, wie ich nicht das Attribut zu packen, struct, d.h.
__attribute__ ((__packed__))
(also statt 6 bytes bekommt es eingepackt in die 4 bytes, die Sie überprüfen können, mit__alignof__
undsizeof
). Ich kann es fast durch hinzufügen_pack_ = True
dem ctypes-Struktur-definition, aber es nicht für fieldE. gcc notes: "Offset-verpackt, bit-field 'fieldE' hat sich in den GCC-4.4".Ausgabe:
C:
flags.asbyte
Feld in diesem Beispiel. Danke für den Hinweis, dass es nicht so klar. Ich habe Poliert den text um es ein wenig klarer. Heh 🙂