Python的构造 - .sizeof()取决于它的父节点

时间:2017-06-25 14:11:10

标签: python parsing construct

这篇文章是关于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

我应该重新设计此协议的建模方式吗?如果是,那怎么样?

1 个答案:

答案 0 :(得分:0)

目前在构造2.9中仍然存在问题(2.8似乎还可以)。

作为一种解决方法,您可以在给定的上下文中通过将子concons的大小相加并直接传递长度来计算大小。

sum(sc.sizeof(length=4) for sc in AttReadByTypeResponse.subcons)