我正在尝试让Kaitai Struct对二进制结构进行逆向工程。 seq
字段可以按预期工作,但是instances
似乎没有按我希望的那样工作。
我的二进制格式包括一个带有常量列表的 header ,我将这些常量解析为带有header
数组子字段的consts
字段:
types:
header:
seq:
# ...
- id: consts
type: u8
repeat: expr
repeat-expr: 0x10
但是,当我尝试使用以下声明时:
instances:
index_const:
value: '_root.header.consts[idx - 0x40]'
if: idx >= 0x40 and idx <= 0x4f
当且仅当
index_const
处于[0x40..0x4f]范围内时,该程序才通过查找header.consts
数组来计算idx
的值。我使用Python作为目标语言,并假定它应该生成类似以下的代码:
@property
def index_const(self):
if hasattr(self, '_m_index_const'):
return self._m_index_const
if self.idx >= 64 and self.idx <= 79:
self._m_index_const = self._root.header.consts[(self.idx - 64)];
return self._m_index_const
但是,我得到的是:
@property
def index_const(self):
if hasattr(self, '_m_index_const'):
return self._m_index_const
self._m_index_const = self._root.header.consts[(self.idx - 64)];
return self._m_index_const
是我自己,我是否缺少明显的东西,还是Kaitai Struct中的错误?
最佳答案
是的,我想应该将其视为错误。至少,编译器应允许在值实例中使用if
并对其进行正确处理,或者不允许if
并发出错误消息。
考虑到这一点,我认为没有理由为什么常规if
允许使用instances
,但是对于value
instances
却采用这种方式。
感谢您举报,我已经提交了an issue。
更新:问题现在被标记为已关闭。
关于python - 开泰结构: calculated instances with a condition,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38334665/