我正在尝试从类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,那么将从数据包中接收一个字节。
答案 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]]))