Объявление C enum
является синтаксической оболочкой для некоторого целочисленного типа.См. Всегда ли sizeof (enum) == sizeof (int)? .Величина int
будет зависеть от конкретного компилятора Си.Вероятно, я бы начал с попытки 16 бит.
union
резервирует блок памяти размером самого большого из содержащихся типов данных.Опять же, точный размер будет зависеть от реализации C, но я ожидаю, что 32-битная архитектура будет 32-битной или 64-битной, если она скомпилирована как собственный 64-битный код.Вообще говоря, вы сможете хранить содержимое объединения в целом или длинном Python независимо от того, что в нем было сохранено - указатель или смещение.
Более интересный вопрос: почемууказатель будет записан в файл на диске.Вы можете обнаружить, что поле union
обрабатывается только как указатель, когда TEEG
struct
находится в памяти, но при записи на диск это всегда целочисленное смещение.
Что касается:4, как отметили несколько человек, это «битовые поля», означающие последовательность битов, некоторые из которых могут быть упакованы в один пробел.Если я правильно помню, битовые поля в C упакованы в int
s, поэтому оба этих 4-битных поля будут упакованы в одно целое число.Они могут быть распакованы с соответствующим использованием операторов Python «&» (поразрядно и) и «>>» (смещение вправо).Опять же, то, как именно поля были упакованы в целое число, и размер самого целочисленного поля, будет зависеть от конкретной реализации языка Си.
Возможно, следующий фрагмент кода поможет вам:
SIZEOF_TEEG_TYPE = 2 # First guess for enum is two bytes
FMT_TEEG_TYPE = "h" # Could be "b", "B", "h", "H", "l", "L", "q" or "Q"
SIZEOF_LONG = 4 # Use 8 in 64-bit Unix architectures
FMT_LONG = "l" # Use "q" in 64-bit Unix architectures
# Life gets more interesting if you are reading 64-bit
# using 32-bit Python
SIZEOF_PTR_LONG_UNION = 4 # Use 8 in any 64-bit architecture
FMT_PTR_LONG_UNION = "l" # Use "q" in any 64-bit architecture
# Life gets more interesting if you are reading 64-bit
# using 32-bit Python
SIZEOF_TEEG_STRUCT = SIZEOF_TEEG_TYPE + SIZEOF_LONG + SIZEOF_PTR_LONG_UNION
FMT_TEEG_STRUCT = FMT_TEEG_TYPE + FMT_LONG + FMT_PTR_LONG_UNION
# Constants for TEEG_EVENTs
TEEG_EVENT_TAB1 = 1
TEEG_EVENT_TAB2 = 2
.
.
.
# Read a TEEG structure
teeg_raw = file_handle.read( SIZEOF_TEEG_STRUCT )
teeg_type, teeg_size, teeg_offset = struct.unpack( FMT_TEEG_STRUCT, teeg_raw )
.
.
.
# Use TEEG_TYPE information
if teeg_type == TEEG_EVENT_TAB1:
Do something useful
elif teeg_type == TEEG_EVENT_TAB2:
Do something else useful
else:
raise ValueError( "Encountered illegal TEEG_EVENT type %d" % teeg_type )