I have some struct, with dynamic entries count. I receiving bytearray from UDP and parsing this message as follows:
class MsgStruct(Structure):
_pack_ = 1
def __init__(self, data=None):
if data:
self.unpack(data)
def unpack(self, raw):
fit = sizeof(self)
memmove(addressof(self), raw[:fit], fit)
def pack(self):
return bytearray(self)[:]
def size(self):
return sizeof(self)
class MessageEntry(MsgStruct):
_fields_ = [
('type', c_byte),
('flag', c_byte),
('count', c_int)]
class Message(MsgStruct):
_fields_ = [
('id', c_int),
('entry_count', c_int)]
entries = []
def __init__(self, data=None):
MsgStruct.__init__(self, data=data)
if data:
self.parseEntries(data[self.entry_count:])
def parseEntries(self, data):
offset = 0
size = sizeof(MessageEntry())
for count in range(self.entry_count):
entry = MessageEntry(data[offset:offset+size])
self.entries.append(entry)
offset += size
but I think there is a better way to parsing the message using ctypes.Array or POINTER and trying this:
class Message(MsgStruct):
_fields_ = [
('id', c_int),
('entry_count', c_int),
('entries', POINTER(MessageEntry))]
def __init__(self, data=None):
MsgStruct.__init__(self, data=data)
if data:
self.parseEntries(data[self.entry_count:])
def parseEntries(self, data):
offset = 0
size = sizeof(MessageEntry())
elems = (MessageEntry * self.entry_count)()
self.entries = cast(elems, POINTER(MessageEntry))
for count in range(self.entry_count):
self.entries[count] = MessageEntry(data[offset:offset+size])
offset += size
But when I try to print entries, i'm fall into an endless cycle
msg = Message(x)
for i in msg.entries:
print(i)
What wrong i doing? Is there another way to parsing message with dynamic entries?