我正在尝试让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/

10-10 05:08