2011-11-02 12 views
8

मेरे पास एक बाइनरी फ़ाइल है जिसे मैं पढ़ रहा हूं जहां कुछ 2 बाइट मान 'रिवर्स' बाइट ऑर्डर (थोड़ा एंडियन?) में संग्रहीत हैं, उदाहरण के लिए।बाइनरी डेटा के बाइट ऑर्डर को कैसे स्विच करें

1D 00 13 00 27 00 3B 00 45 00 31 00 4F 

मूल मूल्य जो इन मानों को बनाता है उन्हें आंतरिक रूप से शॉर्ट्स के रूप में स्टोर करता है। उन मानों के अनुरूप होना चाहिए: 2 9, 1 9, 3 9, 5 9, 69, 4 9, 79. मैं पाइथन 2.6.5 का उपयोग करके इन मानों को पढ़ने की कोशिश कर रहा हूं (हालांकि यह शायद पुराने सिस्टम पर चलाया जाएगा, उदाहरण के लिए 2.3 और 2.4) ।

मैं

val1, val2, val3, val4, val5, val6, val7 = struct.unpack("1h 1h 1h 1h 1h 1h 1h", data) 

का उपयोग कर की कोशिश की है और, ज़ाहिर है, मानों सब बाहर गलत आते हैं:

7427 
4864 
9984 
15104 
17664 
12544 
20224 

struct के लिए दस्तावेज़ को देखने के बाद, मैंने सोचा कि मैं सक्षम होगा

val1, ... = struct.unpack("!h !h ... 

लेकिन जैसे कुछ का उपयोग करने के लिए जब परीक्षण, मैं केवल

मिला
struct.error: bad char in struct format 

मैं इन मूल्यों को सही बाइट ऑर्डरिंग के साथ कैसे अनपैक कर सकता हूं? क्या मैं दो बाइटों में अलग-अलग पढ़ रहा हूं, फिर उन्हें अजगर कोड में फिर से इकट्ठा कर रहा हूं?

उत्तर

9

प्रारूप स्ट्रिंग की शुरुआत में बाइट ऑर्डर को एक वर्ण के साथ निर्दिष्ट किया गया है।

values = struct.unpack('!7h', data) 
+0

आह, वह था। मेरे पास प्रारूप स्ट्रिंग में कई प्रारूप विनिर्देशक हैं लेकिन पूरे स्ट्रिंग की शुरुआत के बजाय केवल 'h' विनिर्देशक के सामने बाइट ऑर्डर चार रखा गया है। धन्यवाद! – pfyon

3

कैसे

के बारे में

>>> a='\x1d\x00\x13\x00\x27\x00\x3b\x00\x45\x00\x31\x00\x4f\x00'

>>> struct.unpack('<%dH' % (len(a)/2), a)

(29, 19, 39, 59, 69, 49, 79)?

struct प्रलेखन के अनुसार ऐसा लगता है कि आपको थोड़ा-एंडियन निर्दिष्ट करने के लिए < का उपयोग करने की आवश्यकता है।

0

मैंने a.byteswap(True) का उपयोग करके उलट बाइट ऑर्डर की एक समान समस्या हल की है, लेकिन मुझे यकीन नहीं है कि यह सबसे प्रभावी तरीका है या नहीं।