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.
InformationsquelleAutor Tuxdude | 2011-08-25
Schreibe einen Kommentar