5

Kaitai Struct ürününün bir ikili yapıyı tersine çevirmesini sağlamaya çalışıyorum. seq alanları amaçlandığı gibi çalışır, ancak instances istediğim gibi çalışmıyor.Kaitai Yapısı: bir koşullu hesaplanmış örnekler

instances: 
    index_const: 
    value: '_root.header.consts[idx - 0x40]' 
    if: idx >= 0x40 and idx <= 0x4f 
: Ben şu bildiriyi kullanmaya çalıştığınızda, ancak

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

:

Benim ikili biçim ben consts dizi subfield ile header alan olarak ayrıştırmak sabitler listesini içeren bir başlık içerir

Bu index_const değerini dizisine bakarak ve yalnızca idx [0x40..0x4f] aralığındaysa hesaplamak için tasarlanmıştır.

benim hedef dili olarak Python kullanmak ve bunu gibi kodu oluşturmak gerektiğini varsayalım: Ancak

@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 

, ne olsun:

@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 

sadece ben mi, Neredeyim Bariz bir şey eksik mi, yoksa Kaitai Struct'ta bir böcek mi?

cevap

2

Evet, sanırım bir böcek olarak görülmelidir. En azından, derleyici if'u değer örneklerinde kullanmalı ve düzgün şekilde işleyebilir veya if'a izin vermeli ve bir hata iletisi vermelidir. if düzenli instances için izin verilir, ancak valueinstances için bu şekilde tedavi edilir neden bunun

Düşünme, ben neden göremiyorum.

Rapor ettiğiniz için teşekkürler, an issue gönderdim.

+0

Teşekkürler! Bu bir hata olduğunu üzücü :(Geçici çözümler hakkında herhangi bir fikir veya bir hata için ne kadar beklemeliyim? –

+0

En basit çözüm, 'index_const'na erişmek istediğiniz yerde' if 'ne varsa, sadece satır içi yapmak olabilir Gerçek kodda bunu yapmak genellikle sorun değil, ancak KS iç ifade dili için biraz zor olabilir, sizi güncel tutmaya çalışacağım. – GreyCat