以下是使用construct
Python库定义的简单标签长度值结构:
Tlv = Struct(
'tag' / Int16ub,
'length' / Int32ub,
'value' / Array(this.length, Byte)
)
if __name__ == '__main__':
tlv_data = dict(tag=1, length=5, value=b'\xFF\xFF\xFF\xFF\xFF')
encoded = Tlv.build(tlv_data)
print(encoded)
decoded = Tlv.parse(encoded)
print(decoded)
尽管示例正确地对数据进行了编码和解码,但我需要提前知道value
字段的长度,并通过length
参数将其提供。
是否有一种方法可以让我通过传递最基本的最小值(即tlv_data = dict(tag=1, value=b'\xFF\xFF\xFF\xFF\xFF')
来初始化结构,并让其自己找出length
字段的适当值?
同时,当我解析原始数据时,我希望它从原始数据中提取长度,然后确保value
确实有那么多字节长。
这应该是原则上可行的,还是我误解了construct
的意识形态?
答案 0 :(得分:0)
在这种情况下,我相信您正在寻找Rebuild
。
摘自Construct's docs当前的示例:
>>> st = Struct(
... "count" / Rebuild(Byte, len_(this.items)),
... "items" / Byte[this.count],
... )
>>> st.build(dict(items=[1,2,3]))
b'\x03\x01\x02\x03'