Я уверен, что смогу сделать это, унаследовав класс Struct, но форматирование упаковки ужасно, и В любом случае вся моя структура имеет прямой порядок байтов, поэтому я подумал об использовании пакета ctypes.
Предположим, у меня есть следующая структура C:
Код: Выделить всё
struct my_c_struct
{
uint32_t a;
uint16_t b;
uint16_t table[];
};
Код: Выделить всё
uint8_t buf[128];
// This cast violates strict aliasing rules, see the comments below.
struct my_c_struct *p = (struct my_c_struct*) buf;
p->table[0] = 0xBEEF;
Код: Выделить всё
class MyCStruct(ctypes.LittleEndianStructure):
c_uint32 = ctypes.c_uint32
c_uint16 = ctypes.c_uint16
_pack_ = 1
_fields_ = [
("a", c_uint32),
("b", c_uint16),
]
def __init__(self, a, b):
"""
Constructor
"""
super(ctypes.LittleEndianStructure, self).__init__(a, b)
self.table = []
def pack(self):
data = bytearray(self.table)
return bytearray(self)+data
То, как я это реализовал, очевидно, не работает. Поэтому я подумал о вложении класса, созданного ctypes, в чистый класс Python:
Код: Выделить всё
class MyCStruct:
class my_c_struct(ctypes.LittleEndianStructure):
_pack_ = 1
_fields_ = [ ("a", ctypes.c_uint32),
("b", ctypes.c_uint16) ]
def __init__(self, a, b):
"""
Constructor
"""
self.c_struct = self.my_c_struct(a,b)
self.table = []
def pack(self):
self.c_struct.b = len(self.table)
x = bytearray(self.c_struct)
y = bytearray()
for v in self._crc_table:
y += struct.pack("
Подробнее здесь: [url]https://stackoverflow.com/questions/63853622/python-ctypes-struct-with-flexible-array-member-to-bytearray[/url]