def __pack__(self):
fmt = self.endian
value_list = []
for field in self._field_names_:
fmt_ = self._field_format_[field]
val = getattr(self, field)
if isinstance(fmt_, StructArray):
value_list.extend([
getattr(struct_, field)
for struct_ in fmt_.structure_list
for field in struct_._field_names_
])
elif isinstance(fmt_, basestring) and (fmt_.startswith('BBB') or fmt_.startswith('bbb')):
value_list.extend([(val >> i & 0xFF) for i in [x for x in range(0, len(fmt_) * 8, 8)]])
else:
try:
value_list.append(val.encode('ascii', 'ignore'))
except AttributeError:
value_list.append(val)
fmt += str(len(val)) + 's' if fmt_ == 'variable' else fmt_.get_struct() if isinstance(fmt_, StructArray) else fmt_
try:
return struct.pack(fmt, *value_list)
except struct.error as exc:
raise_from(PackError("Unable to pack structure"), exc)
评论列表
文章目录