python ctypes pragma pack для выровненного байта

У меня есть приложение на C ++ с нижележащей структурой, написанной в файл. Теперь мне нужно размонтировать их с помощью python. Основная проблема заключается в том, как отразить опцию pragma pack в 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 использует собственный порядок байтов для Structures and Unions. Чтобы построить структуры с неместным порядком байтов, вы можете использовать один из базовых классов BigEndianStructure, LittleEndianStructure, BigEndianUnion и LittleEndianUnion. Эти классы не могут содержать поля указателя


Вышеприведенная информация из документов python не вникает в детали.

    Вы можете изменить упаковку в ctypes, как описано здесь

    По умолчанию поля Structure и Union выравниваются так же, как это делает компилятор C. Это поведение можно переопределить, указав атрибут класса пакета в определении подкласса. Это должно быть установлено положительное целое число и задает максимальное выравнивание полей. Это то, что #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)]