के साथ गणना की गई घटनाएं मैं एक बाइनरी संरचना को रिवर्स इंजीनियर के लिए काटाई स्ट्रक्चर प्राप्त करने की कोशिश कर रहा हूं। seq
फ़ील्ड इरादे के अनुसार काम करते हैं, लेकिन instances
काम नहीं करते हैं क्योंकि मैं उन्हें चाहता हूं। ,काइटाई संरचना:
types:
header:
seq:
# ...
- id: consts
type: u8
repeat: expr
repeat-expr: 0x10
लेकिन जब मैं निम्नलिखित घोषणा इस्तेमाल करने की कोशिश:
मेरे द्विपदीय प्रारूप स्थिरांक की एक सूची के साथ एक शीर्ष लेख है कि मैं consts
सरणी उप क्षेत्र के साथ header
क्षेत्र के रूप में पार्स शामिल
instances:
index_const:
value: '_root.header.consts[idx - 0x40]'
if: idx >= 0x40 and idx <= 0x4f
यह की सरणी में देखकर index_const
के मान की गणना करने का इरादा है यदि केवल idx
[0x40..0x4f] की सीमा में है।
मैं अपने लक्ष्य भाषा के रूप में अजगर का उपयोग करें और मुझे लगता है कि ऐसा लगता है कि एक कोड जेनरेट करना चाहिए:
@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
हालांकि, मैं क्या मिलता है:
@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
यह सिर्फ मुझे है, मैं कर रहा हूँ कुछ स्पष्ट याद आ रही है, या यह कaitई संरचना में एक बग है?
धन्यवाद! यह एक दयालु बात है कि यह एक बग है :(वर्कअराउंड पर किसी भी विचार या मुझे बगफिक्स के लिए कितना इंतजार करना चाहिए? –
सबसे आसान कामकाज केवल उस स्थान पर 'if' में है जो आप अपने' index_const' तक पहुंचाना चाहते हैं वास्तविक कोड में ऐसा करना आम तौर पर ठीक है, लेकिन यह केएस आंतरिक अभिव्यक्ति भाषा के लिए कुछ मुश्किल हो सकता है। मैं आपको अद्यतन रखने की कोशिश करूंगा। – GreyCat