如何构造具有可变大小元素的数据结构

时间:2016-09-22 09:34:45

标签: python construct

我正在尝试从类val构造具有可变大小的元素from construct import * TEST = Struct("test", UInt8("class"), Embed(switch(lambda ctx: ctx.class) { 1: UInt8("value"), 2: UInt16("value"), 3: UInt32("value")} )) ) 的结构:

{{1}}

以上代码不正确。

我需要实现这样的事情:如果类为1,那么将从数据包中接收一个字节。

1 个答案:

答案 0 :(得分:0)

您可以使用多个format string更改struct行为,struct.unpack_from使用struct.calcsize继续解析最后找到的字节序列末尾的bytearray:

import struct
v1 = bytearray([0x00,0xFF])
v2 = bytearray([0x01,0xFF,0xFF])
v3 = bytearray([0x02,0xFF,0xFF,0xFF,0xFF])

v = v2 # change this

header_format = 'B'
body_format_variants = {0:'B',1:'H',2:'L'}

header = struct.unpack_from(header_format,v,0)
body = struct.unpack_from(body_format_variants[header[0]],v,struct.calcsize(header_format))

print (header, body, "size=",struct.calcsize('>'+header_format+body_format_variants[header[0]]))