2013-02-08 5 views
5

Ich habe eine C++ - Anwendung mit unten Struktur in Datei geschrieben. Jetzt muss ich sie mit Python entpacken, Das grundlegende Problem hier ist, wie die pragma pack Option in Python widerspiegeln.Python Ctypes Pragma-Pack für Byte ausgerichtet Lesen

C++ Struktur

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

nun die Strukturgröße 7 not 8 ist, werden diese Daten in eine Datendatei geschrieben. Wie lade ich diese Daten mit Python ab?

Hinweis:
1. Ich verwende Ctypes, und die obige Struktur ist eine Beispielstruktur.


ctypes nutzt die native Byte-Reihenfolge für Strukturen und Unions. Um Strukturen mit nicht-nativer Byte-Reihenfolge zu erstellen, können Sie eine der Basisklassen BigEndianStructure, LittleEndianStructure, BigEndianUnion und LittleEndianUnion verwenden. Diese Klassen können nicht Zeigerfelder


Die obigen Informationen aus Python-Dokumentation enthalten, tauchen nicht in Details.

Antwort

11

Sie können die Verpackung in ctypes als here beschrieben ändern

standardmäßig Struktur und Union Felder sind in der gleichen Art und Weise der C-Compiler tut es ausgerichtet ist. Es ist möglich, dieses Verhalten zu überschreiben, indem Sie ein Klassenattribut pack in der Unterklassendefinition angeben. Dies muss auf eine positive ganze Zahl festgelegt werden und gibt die maximale Ausrichtung für die Felder an. Das ist es, was #pragma pack (n) auch in MSVC macht.

Für Ihr Beispiel hierfür wäre:

from ctypes import * 

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

Dank. Es funktionierte! –