Sto scrivendo un parser per un formato binario. Questo formato binario coinvolge diverse tabelle che sono di nuovo in formato binario che contengono in genere campi di dimensioni variabili (da qualche parte tra 50 e 100).Accesso ai bitfield durante la lettura/scrittura di strutture di dati binari
La maggior parte di queste strutture avranno campi di bit e sarà simile a questi quando rappresentato in C:
struct myHeader
{
unsigned char fieldA : 3
unsigned char fieldB : 2;
unsigned char fieldC : 3;
unsigned short fieldD : 14;
unsigned char fieldE : 4
}
mi sono imbattuto il modulo struct, ma sono reso conto che la sua risoluzione più bassa era un byte e non un po ', altrimenti il modulo praticamente era adatto per questo lavoro.
So che i bitfield sono supportati usando i ctypes, ma non sono sicuro di come interfacciare le strutture di tipo ctypes che contengono bitfield qui.
La mia altra opzione è quella di manipolare i bit personalmente e inserirli in byte e utilizzarli con il modulo struct - ma poiché ho vicino a 50-100 tipi diversi di tali strutture, scrivere il codice per questo diventa più un errore- prona. Sono anche preoccupato per l'efficienza poiché questo strumento potrebbe essere utilizzato per analizzare grandi gigabyte di dati binari.
Grazie.
ci sono anche librerie di manipolazione bit array/bit di terze parti. – agf
Sarebbe una buona quantità di lavoro, ma probabilmente potresti progettare una classe in grado di analizzare le definizioni di struttura in stile C (o qualcosa di simile a loro che eliminava l'ambiguità di imballaggio) in un set di maschere per ogni bitfield, leggi i dati in via il modulo struct per arrivare a livello di byte e offrire l'accesso '__getattr__'. –
Sì, mi sono imbattuto in questi strumenti: [python-bitstring] (http://code.google.com/p/python-bitstring/), [Construct] (http://construct.wikispaces.com/tut-basics), [BitReader] (https://bitbucket.org/jtoivola/bitreader/wiki/Home) - e leggendo i loro documenti.Bit Reader sembra una soluzione valida ma vedo [qui] (http://blog.mfabrik.com/2010/09/08/bitreader-python-module-for-reading-bits-from-bytes/) che la performance sarà un grande successo. Costruire per quanto ho potuto trovare dalla loro documentazione di base non supporta campi di bit. Python-bitstring sembra promettente e ha bisogno di scavare un po 'più in profondità – Tuxdude