Estoy escribiendo un analizador para un formato binario. Este formato binario involucra diferentes tablas que están de nuevo en formato binario con tamaños de campo variables generalmente (en algún lugar entre 50 - 100 de ellos).Accediendo a los campos de bit mientras lee/escribe estructuras de datos binarios
La mayoría de estas estructuras tendrán campos de bits y se verá algo como esto cuando se representa en C:
struct myHeader
{
unsigned char fieldA : 3
unsigned char fieldB : 2;
unsigned char fieldC : 3;
unsigned short fieldD : 14;
unsigned char fieldE : 4
}
me encontré con el módulo de estructura pero se dio cuenta de que su resolución más baja fue de un byte y no un poco, de lo contrario el módulo fue el más adecuado para este trabajo.
Sé que los bitfields son compatibles con ctypes, pero no estoy seguro cómo interconectar las estructuras de ctypes que contienen bitfields aquí.
Mi otra opción es manipular los bits yo mismo y alimentarlo en bytes y usarlo con el módulo struct, pero dado que tengo cerca de 50-100 tipos diferentes de tales estructuras, escribir el código para eso se convierte en más error- propenso. También me preocupa la eficiencia, ya que esta herramienta podría usarse para analizar grandes gigabytes de datos binarios.
Gracias.
También hay bibliotecas de manipulación de bits/matriz de bits. – agf
Sería una buena cantidad de trabajo, pero probablemente podría diseñar una clase que pueda analizar las definiciones de estructura tipo C (o algo similar a ellas que eliminó la ambigüedad de empaque) en un conjunto de máscaras para cada campo de bits, leer los datos en via el módulo struct para llegar al nivel de bytes, y ofrecer el acceso '__getattr__'. –
Sí, ahora encontré estas herramientas - [python-bitstring] (http://code.google.com/p/python-bitstring/), [Construir] (http://construct.wikispaces.com/tut-basics), [BitReader] (https://bitbucket.org/jtoivola/bitreader/wiki/Home) - y leyendo sus documentos.Bit Reader parece ser una solución viable, pero veo [aquí] (http://blog.mfabrik.com/2010/09/08/bitreader-python-module-for-reading-bits-from-bytes/) que el rendimiento va a ser un gran éxito. Construir tan lejos como pude encontrar a partir de su documentación básica no admite campos de bits. Python-bitstring suena prometedor y necesita profundizar un poco más – Tuxdude