这篇文章是关于Python的Construct库
代码
这些是我的构造的定义:
from construct import *
AttributeHandleValuePair = "attribute_handle_value_pair" / Struct(
"handle" / Int16ul,
"value" / Bytes(this._.length - 2)
)
AttReadByTypeResponse = "read_by_type_response" / Struct(
"length" / Int8ul, # The size in bytes of each handle/value pair
"attribute_data_list" / AttributeHandleValuePair[2]
)
问题
尝试运行以下命令:
AttReadByTypeResponse.sizeof(dict(length=4, attribute_data_list=[dict(handle=1, value=2), dict(handle=3, value=4)])
我收到以下错误:
SizeofError: cannot calculate size, key not found in context
sizeof -> read_by_type_response -> attribute_data_list -> attribute_handle_value_pair -> value
我发现了什么
每个value
的{{1}}字段的大小来自其父级的attribute_handle_value_pair
字段。我认为length
方法首先尝试计算sizeof()
的大小,而attribute_handle_value_pair
的{{1}}字段仍未定义,因此无法计算其大小。< / p>
我尝试将length
字段的长度更改为静态值,但效果很好。
我的问题
如何计算取决于其父构造的构造的read_by_type_response
?
我应该重新设计此协议的建模方式吗?如果是,那怎么样?
答案 0 :(得分:0)
目前在构造2.9中仍然存在问题(2.8似乎还可以)。
作为一种解决方法,您可以在给定的上下文中通过将子concons的大小相加并直接传递长度来计算大小。
sum(sc.sizeof(length=4) for sc in AttReadByTypeResponse.subcons)