सी संरचनाओं का उपयोग कर सी फ्रेड की तरह अनपैक करने के लिए पायथन संरचना?

मैं एक बाइनरी फ़ाइल के शीर्षलेख को अनपैक करने के लिए सी (मूल रूप से फोरट्रान) से पायथन तक कोड का एक स्निपेट बंद करने के लिए संघर्ष कर रहा हूं।

सी है:

fread(&hdr, hdrSize, 1, modelFile);

alb    = hdr.fd[0];
skrc   = hdr.fd[2];
taud   = hdr.fd[16];
djul   = hdr.fd[40];
deljul = hdr.fd[41];
n4     = hdr.id[3];
n5     = hdr.id[4];
n24    = hdr.id[5];
jdisk  = hdr.id[11];
k4out  = hdr.id[16];
j5     = hdr.id[39];

फ़ाइल फोरट्रान का उपयोग करके लिखी गई है, उदाहरण के लिए, एबी को परिभाषित किया गया है (एफ 10.2) और एन 4 को परिभाषित किया गया है (I10)।

मैंने struct मॉड्यूल, numpy.fromfile() , और numpy.fromstring() दोनों का उपयोग करने का प्रयास किया। मुझे कुल हेडर आकार पता है, इसलिए numpy.fromstring() का उपयोग करके मैं बाइनरी ( open (file, 'r + b' ) पढ़ सकता हूं और एक सरणी उत्पन्न कर सकता हूं उम्मीद से काफी लंबा - यह 0.0 के साथ बैकफिल किया गया है, जो मुझे लगता है कि हेडर एक निश्चित आकार है और भरण डेटा छोटा है।

क्या struct मॉड्यूल डेटा को एक्सेस करने के लिए जिस तरह से फ़्रेड() करता है? सी कोड में, मेरा मानना ​​है कि .fd [0] इंगित करता है कि हम संरचना 0 को देख रहे हैं? यदि हां, तो वह पैटर्न पायथन में डुप्लिकेट करने योग्य है?

संपादित करें: मैं सी कोड में .id या .fd नहीं ढूंढ पा रहा हूं, लेकिन मूल किलान उन्हें परिभाषित करता है

 REAL*4    FD(80)          
 INTEGER*4 ID(40) 

फोरट्रान से सी तक का बाकी बंदरगाह अनिवार्य रूप से क्रियात्मक है, इसलिए मुझे लगता है कि घोषणाएं समान हैं।

EDIT2: निम्नलिखित कार्य प्रतीत होता है - उसमें परिवर्तनीय मान तार्किक हैं। यह संरचना मॉड्यूल का उपयोग कर रहा है।

with open(sys.argv[1], 'r+b') as l:
    headdata = l.read(HEAD_BYTES)
    fd_arr = struct.unpack('f'*80, headdata[0:320])
    print fd_arr[0]
    print fd_arr[2]
    print fd_arr[16]
    print fd_arr[40]
    print fd_arr[41]
    id_arr = struct.unpack('i'*40, headdata[320:480])
    print id_arr[3]
    print id_arr[4]
    print id_arr[5]
    print id_arr[11]
    print id_arr[16]
    print id_arr[39]

स्ट्रिंग के भीतर मिश्रित प्रकारों के प्रभाव को देखने के लिए मैं एक प्रारूप स्ट्रिंग का उपयोग करके एक्सप्लोर करूंगा।

0
@JamesRoth मूल फोरट्रान कोड से कुछ जानकारी का उपयोग करके अपडेट किया गया - घोषणाएं समान होनी चाहिए।
जोड़ा लेखक Jzl5325, स्रोत
@qwrrty Glad मैं सही रास्ते पर हूं - मुझे डर है कि मेरे पास एक जटिल स्वरूपण स्ट्रिंग होगी, यानी एक 80 तत्व फ्लोट सरणी और 40 तत्व पूर्णांक सरणी होगी। कुछ ऐसा: ( '>' + 'f' * 80 + 'i' * 40 ) या ( '> f80' + 'i40' )?
जोड़ा लेखक Jzl5325, स्रोत
@qwrrty मिश्रित स्वरूपण स्ट्रिंग के साथ संपादित - संयुक्त स्वरूपण के साथ भी काम करता है हालांकि ऑफसेट्स पुराने कोड से स्वाभाविक रूप से भिन्न होते हैं। मुझे आश्चर्य है कि array मॉड्यूल इस डिकोडिंग का भी समर्थन करेगा क्योंकि मुझे एक प्राथमिकता पता है कि डेटा सरणी की एक जोड़ी है।
जोड़ा लेखक Jzl5325, स्रोत
ऐसा लगता है कि struct मॉड्यूल का क्या इरादा था, हालांकि संरेखण के मुद्दों को रास्ते में मिल सकता है।
जोड़ा लेखक Tim Pierce, स्रोत
ऐसा लगता है कि यदि आप दस्तावेज़ को सही तरीके से पढ़ रहे हैं तो आप '> 80f40i' जैसे प्रारूप स्ट्रिंग का उपयोग कर सकते हैं। मैंने इसे स्वयं नहीं इस्तेमाल किया है, लेकिन यह एक कोशिश के लायक लगता है।
जोड़ा लेखक Tim Pierce, स्रोत
ध्यान दें कि numpy आमतौर पर इसकी संरचित dtypes संरेखित नहीं करता है, जबकि एक सामान्य संकलक होगा। Dtype परिभाषा में aligned = True कीवर्ड जोड़ने का प्रयास करें।
जोड़ा लेखक seberg, स्रोत
यह आसान होना चाहिए, लेकिन यह निर्भर करता है कि एफडी और आईडी क्या हैं। क्या आप अपने उदाहरण के लिए जो भी डेटाटाइप एचडीआर की परिभाषा जोड़ सकते हैं?
जोड़ा लेखक James Roth, स्रोत