5

Próbuję zmusić Kaitai Struct do inżynierii wstecznej struktury binarnej. seq pola działają zgodnie z przeznaczeniem, ale instances nie działają tak, jak chcę.Kaitai Struct: obliczone instancje z warunkiem

Moja formacie binarnym zawiera nagłówek z listy stałych że I analizować jako header polu consts tablicy podpola:

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

Jednak, gdy próbuję użyć następujące oświadczenie:

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

Ten jest przeznaczony do obliczenia wartości index_const przez sprawdzenie w tablicy header.consts wtedy i tylko wtedy, gdy idx jest w zakresie [0x40..0x4f].

Używam Python jako mój język docelowy i zakładam, że powinno wygenerować kod jak:

@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 

Jednak to, co pojawia się:

@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 

Czy to tylko mnie, czy jestem brakuje czegoś oczywistego, czy też jest to błąd w Kaitai Struct?

Odpowiedz

2

Tak, myślę, że to powinno być uważane za błąd. W każdym razie kompilator powinien albo zezwalać na używanie wartościw wartościach instancji i przetwarzać go poprawnie, albo uniemożliwić if i wysłać komunikat o błędzie.

Myśląc o nim, nie widzę powodu, dlaczego if dopuszcza do regularnego instances, ale traktowane w ten sposób do valueinstances.

Dzięki za zgłoszenie, przesłałem an issue.

+0

Dzięki! Szkoda, że ​​to błąd :(Jakieś pomysły dotyczące obejść i ile powinienem czekać na poprawkę? –

+0

Najprostszym rozwiązaniem byłoby po prostu wstawienie cokolwiek masz w 'if' w miejscu, do którego chcesz uzyskać dostęp do' index_const' Na ogół dobrze jest robić to w prawdziwym kodzie, ale może to być nieco trudne dla języka wewnętrznego w języku KS. Postaram się na bieżąco informować. – GreyCat