5

Ich versuche, Kaitai Struct zu bekommen, um eine binäre Struktur zurückzuentwickeln. seq Felder funktionieren wie vorgesehen, aber instances scheinen nicht so zu funktionieren, wie ich es möchte.Kaitai Struct: berechnete Instanzen mit einer Bedingung

Mein Binärformat enthält einen Header mit einer Liste von Konstanten, die ich mit consts Array-Unterfeld als header Feld analysieren:

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

aber wenn ich versuche, die folgende Erklärung zu verwenden:

instances: 
    index_const: 
    value: '_root.header.consts[idx - 0x40]' 
    if: idx >= 0x40 and idx <= 0x4f 

Dieser Wert soll einen Wert von index_const berechnen, indem in das Array header.consts genau dann nachgesehen wird, wenn idx im Bereich [0x40..0x4f] liegt.

ich Python als meine Zielsprache verwenden, und ich nehme an, dass es einen Code wie generieren soll:

@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 

Doch was ich bekommen ist:

@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 

Ist es nur mich, ich bin etwas offensichtliches fehlt, oder ist es ein Fehler in Kaitai Struct?

Antwort

2

Ja, ich denke, es sollte als ein Fehler betrachtet werden. Zumindest sollte der Compiler entweder if in Werteinstanzen verwenden und ihn ordnungsgemäß verarbeiten oder if verbieten und eine Fehlermeldung ausgeben.

Denken an es, sehe ich keinen Grund, warum if für regelmäßige instances erlaubt, aber auf diese Weise für valueinstances behandelt.

Vielen Dank für Ihre Meldung, ich habe an issue eingereicht.

+0

Danke! Es ist schade, dass es ein Bug ist :(Irgendwelche Ideen zu Workarounds oder wie viel sollte ich auf einen Bugfix warten? –

+0

Die einfachste Problemumgehung wäre, nur was Sie haben in "if" an der Stelle, die Sie auf Ihre "index_const" zugreifen möchten Es ist im Allgemeinen in Ordnung, dies in echtem Code zu tun, aber es kann etwas schwierig für die interne Ausdrucksweise von KS sein. Ich werde versuchen, Sie auf dem Laufenden zu halten. – GreyCat