5

Sto cercando di ottenere Kaitai Struct per decodificare una struttura binaria. I campi seq funzionano come previsto, ma il instances non sembra funzionare come voglio.Stringa Kaitai: istanze calcolate con una condizione

mio formato binario include un'intestazione con un elenco di costanti che mi parse come header campo con consts serie sottocampo:

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

Tuttavia, quando cerco di usare la seguente dichiarazione:

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

Questo ha lo scopo di calcolare un valore di index_const esaminando la matrice di header.consts se e solo se idx è nell'intervallo [0x40..0x4f].

io uso Python come la mia lingua di destinazione e presumo che dovrebbe generare un codice come:

@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 

Tuttavia, ciò che ottengo è:

@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 

Sono solo io, sono io manca qualcosa di ovvio, o è un bug in Kaitai Struct?

risposta

2

Sì, credo che dovrebbe essere considerato un bug. Per lo meno, il compilatore dovrebbe consentire di utilizzare if in istanze di valore ed elaborarlo correttamente, oppure non consentire lo if ed emettere un messaggio di errore.

Pensare di esso, non vedo alcun motivo per cui if è consentito per regolare instances, ma trattati in questo modo per valueinstances.

Grazie per averlo segnalato, ho inviato an issue.

+0

Grazie! È un peccato che sia un bug :(Qualche idea su soluzioni alternative o quanto dovrei aspettare per una correzione di bug? –

+0

La soluzione più semplice sarebbe quella di incorporare qualsiasi cosa tu abbia in "if" nel punto in cui vuoi accedere a "index_const". a. In generale è ok farlo nel codice reale, ma può essere alquanto complicato per il linguaggio di espressioni interne di KS. Proverò a tenerti aggiornato. – GreyCat