2013-02-08 14 views
5

मेरे पास फ़ाइल में लिखी गई नीचे संरचना के साथ एक सी ++ एप्लिकेशन है। अब मुझे पायथन का उपयोग करके उन्हें उतारना होगा, यहां मूल समस्या यह है कि पाइथन में pragma pack विकल्प को कैसे प्रतिबिंबित किया जाए।बाइट गठबंधन के लिए पायथन ctypes pragma पैक

सी ++ संरचना

#pragma pack(1) 
struct abc 
{ 
unsigned char r1; 
unsigned char r2; 
unsigned char p1; 
unsigned int id; 
}; 
#pragma pack() 

अब, संरचना आकार 7 not 8 होने पर इस डेटा एक डेटा फ़ाइल में लिखा है। मैं पाइथन का उपयोग करके इस डेटा को कैसे प्राप्त करूं?

नोट:
1. मैं ctypes का उपयोग कर रहा हूं, और उपर्युक्त संरचना नमूना संरचना है।


ctypes संरचनाएं और यूनियनों के लिए देशी बाइट क्रम का उपयोग करता है। गैर देशी बाइट ऑर्डर के साथ संरचनाओं का निर्माण करने के लिए, आप बिग इंडियन स्ट्रक्चर, लिटिल इंडियन स्ट्रक्चर, बिगइंडियन यूनियन, और लिटिल इंडियन यूनियन बेस क्लासेस का उपयोग कर सकते हैं। इन कक्षाओं सूचक क्षेत्रों


अजगर डॉक्स से उपरोक्त जानकारी नहीं हो सकते, विवरण में संगम नहीं है।

उत्तर

11

आप के रूप में वर्णित here

डिफ़ॉल्ट, संरचना करके और संघ क्षेत्रों उसी तरह सी संकलक यह करता है में गठबंधन कर रहे हैं ctypes में पैकिंग बदल सकते हैं। इस व्यवहार को ओवरराइड करना संभव है पैक उप-वर्ग परिभाषा में वर्ग विशेषता निर्दिष्ट करना। यह एक सकारात्मक पूर्णांक पर सेट किया जाना चाहिए और फ़ील्ड के लिए अधिकतम संरेखण निर्दिष्ट करता है। यह #pragma पैक (एन) एमएसवीसी में भी करता है।

अपने उदाहरण के लिए इस होगा:

from ctypes import * 

class abc(Structure): 
    _pack_ = 1 
    _fields_ = [ 
     ('r1',c_ubyte), 
     ('r2',c_ubyte), 
     ('p1',c_ubyte), 
     ('id',c_uint)] 
+0

धन्यवाद। इसने काम कर दिया! –

संबंधित मुद्दे