9

ファイルに書き込まれた以下の構造を持つ C++ アプリケーションがあります。pragma packここで、Python を使用してそれらを非整列化する必要があります。ここでの基本的な問題は、Python でオプション を反映する方法です。

C++ 構造

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

これで、構造体のサイズはになり7 not 8、このデータはデータ ファイルに書き込まれます。Python を使用してこのデータを取得するにはどうすればよいですか。

注:
1. 私は ctypes を使用しており、上記の構造はサンプル構造です。


ctypes は、構造体と共用体にネイティブのバイト順を使用します。ネイティブでないバイト順で構造を構築するには、BigEndianStructure、LittleEndianStructure、BigEndianUnion、LittleEndianUnion 基本クラスのいずれかを使用できます。これらのクラスにはポインター フィールドを含めることはできません


python docs からの上記の情報は、詳細を掘り下げていません。

4

1 に答える 1

19

ここで説明されているように、ctypes のパッキングを変更できます

デフォルトでは、Structure フィールドと Union フィールドは C コンパイラと同じ方法で整列されます。サブクラス定義でpackクラス属性を指定することで、この動作をオーバーライドすることができます。これは正の整数に設定する必要があり、フィールドの最大位置合わせを指定します。これは #pragma pack(n) が MSVC でも行うことです。

あなたの例では、これは次のようになります。

from ctypes import *

class abc(Structure):
    _pack_ = 1
    _fields_ = [
        ('r1',c_ubyte),
        ('r2',c_ubyte),
        ('p1',c_ubyte),
        ('id',c_uint)]
于 2013-02-08T13:11:23.933 に答える