5

私は、Kaitai Structにバイナリ構造をリバースエンジニアリングしようとしています。 seqフィールドは意図したとおりに動作しますが、instancesは私が望むように動作していないようです。Kaitai Struct:条件付きの計算インスタンス

instances: 
    index_const: 
    value: '_root.header.consts[idx - 0x40]' 
    if: idx >= 0x40 and idx <= 0x4f 
:私は次の宣言を使用しようとすると、しかし

types: 
    header: 
    seq: 
     # ... 
     - id: consts 
     type: u8 
     repeat: expr 
     repeat-expr: 0x10 

マイバイナリ形式は、私はconstsアレイサブフィールドでheaderフィールドとして解析定数のリストを有するヘッダーを含みます

idxが[0x40..0x4f]の範囲にある場合にのみの値をheader.constsの配列にルックアップして計算することを意図しています。

私は私のターゲット言語としてPythonを使用して、私はそれはのようなコードを生成する必要があることを前提と

:私は、それは私だけ

@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 

です:しかし、私が取得することである

@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 

を何かが明らかでないか、それともKaitai Structのバグですか?

答えて

2

ええ、私はそれがバグとみなされるべきだと思います。少なくとも、コンパイラは値インスタンスにifを使用して正しく処理するか、またはifを許可せずにエラーメッセージを発行する必要があります。それの

思考、私はifが定期instancesに許可されますが、valueinstancesために、このように扱われない理由を見ません。

報告していただきありがとうございます。私はan issueを提出しました。

+0

ありがとうございます!回避策に関するアイデアやバグ修正を待たなければならないのは何ですか? –

+0

最も単純な回避策は、あなたが 'index_const'にアクセスしたい場所で' if'にあるものをインライン化することです。実際のコードでは大丈夫ですが、KSの内部表現言語ではやや難しいかもしれませんが、私はあなたに最新の情報を提供していきます。 – GreyCat