2013-02-08 7 views
5

Ho un'applicazione C++ con struttura sottostante scritta su file. Ora ho bisogno di unmarshal usando python, il problema di base qui è come riflettere l'opzione pragma pack in python.python ctypes pragma pack per byte allineato leggere

C++ Struttura

#pragma pack(1) 
struct abc 
{ 
unsigned char r1; 
unsigned char r2; 
unsigned char p1; 
unsigned int id; 
}; 
#pragma pack() 

Ora, la dimensione della struttura è 7 not 8, questi dati vengono scritti in un file di dati. Come posso recuperare questi dati usando python.

Nota:
1. Sto usando i tipi, e la struttura sopra è una struttura di esempio.


ctypes utilizza l'ordine di byte nativo per strutture e sindacati. Per creare strutture con un ordine di byte non nativo, è possibile utilizzare una delle classi base di BigEndianStructure, LittleEndianStructure, BigEndianUnion e LittleEndianUnion. Queste classi non possono contenere campi puntatore


Le informazioni di cui sopra da docs pitone, non approfondire i dettagli.

risposta

11

È possibile cambiare l'imballaggio in ctypes come descritto here

Per impostazione predefinita, Struttura e campi dell'Unione sono allineati allo stesso modo il compilatore C lo fa. È possibile sovrascrivere questo comportamento specificando un attributo di classe nella definizione della sottoclasse. Questo deve essere impostato su un numero intero positivo e specifica l'allineamento massimo per i campi. Questo è ciò che #pragma pack (n) fa anche in MSVC.

Per il tuo esempio questo sarebbe:

from ctypes import * 

class abc(Structure): 
    _pack_ = 1 
    _fields_ = [ 
     ('r1',c_ubyte), 
     ('r2',c_ubyte), 
     ('p1',c_ubyte), 
     ('id',c_uint)] 
+0

Grazie. Ha funzionato! –