Piszę parser dla formatu binarnego. Ten format binarny obejmuje różne tabele, które są ponownie w formacie binarnym, zwykle zawierające zmienne rozmiary pól (gdzieś pomiędzy 50-100 z nich).Uzyskiwanie dostępu do bitfieldów podczas odczytu/zapisu struktur danych binarnych
Większość z tych obiektów będzie miał bitfields i będzie wyglądać jak te, gdy reprezentowane w katalogu C:
struct myHeader
{
unsigned char fieldA : 3
unsigned char fieldB : 2;
unsigned char fieldC : 3;
unsigned short fieldD : 14;
unsigned char fieldE : 4
}
natknąłem modułu struct ale sobie sprawę, że jej najniższy rozdzielczości bajt, a nie trochę, inaczej moduł prawie pasował do tej pracy.
Znam bitfields są obsługiwane przy użyciu ctypes, ale nie jestem pewien, jak interfejs ctypes structs zawierających bitfields tutaj.
Moja druga opcja polega na manipulowaniu bitami i dodawaniu ich do bajtów oraz wykorzystaniu ich w module struct - ale ponieważ mam blisko 50-100 różnych typów takich struktur, zapisanie kodu w ten sposób staje się bardziej błędne. skłonny. Martwię się również o wydajność, ponieważ to narzędzie może być używane do analizowania dużych gigabajtów danych binarnych.
Dzięki.
Istnieją również zewnętrzne biblioteki bitowe szyku/bit manipulacji. – agf
To byłaby spora praca, ale prawdopodobnie mógłbyś zaprojektować klasę, która mogłaby parsować definicje struktur w stylu C (lub coś podobnego do nich, które wyeliminowało niejednoznaczność pakowania) do zestawu masek dla każdego pola bitowego, odczytać dane za pośrednictwem moduł struct, aby przejść do poziomu bajtów i zaoferować dostęp do '__getattr__'. –
Tak, teraz natknąłem się na te narzędzia - [python-bitstring] (http://code.google.com/p/python-bitstring/), [Construct] (http://construct.wikispaces.com/tut-basics), [BitReader] (https://bitbucket.org/jtoivola/bitreader/wiki/Home) - i czytanie przez ich dokumenty.Bit Reader wydaje się być dobrym rozwiązaniem, ale widzę [tutaj] (http://blog.mfabrik.com/2010/09/08/bitreader-python-module-for-reading-bits-from-bytes/), że wydajność będzie wielkim hitem. Zbuduj tak daleko, jak mogłem znaleźć w ich podstawowej dokumentacji nie obsługuje pól bitowych. Python-bitstring brzmi obiecująco i trzeba wkopać się głębiej – Tuxdude