2009-11-08 10 views
12

में कनवर्ट करें मैंने लहर मॉड्यूल का उपयोग करके एक लहर फ़ाइल से नमूने पढ़े हैं, लेकिन यह नमूने को स्ट्रिंग के रूप में देता है, यह तरंग से बाहर है इसलिए यह थोड़ा एंडियन है (उदाहरण के लिए, \x00)।पूर्ण एंडियन स्ट्रिंग को पूर्णांक

इसे एक पायथन पूर्णांक, या numpy.int16 प्रकार में परिवर्तित करने का सबसे आसान तरीका क्या है? (यह अंततः numpy.int16 बन जाएगा, इसलिए सीधे जा रहा है ठीक है)।

कोड को छोटे एंडियन और बड़े एंडियन प्रोसेसर पर काम करने की आवश्यकता है।

+0

सामान्य मामला है: http://stackoverflow.com/questions/444591/convert-a-string-of-bytes-into-an-int-python –

उत्तर

19

struct मॉड्यूल पैक किए गए डेटा को पायथन मूल्यों में परिवर्तित करता है, और इसके विपरीत।

>>> import struct 
>>> struct.unpack("<h", "\x00\x05") 
(1280,) 
>>> struct.unpack("<h", "\x00\x06") 
(1536,) 
>>> struct.unpack("<h", "\x01\x06") 
(1537,) 

"एच" का मतलब एक छोटा int, या 16-बिट int है। "<" का अर्थ है छोटे-एंडियन का उपयोग करें।

+0

python3 के लिए आपको अपनी स्ट्रिंग को पहले बाइट्स में कनवर्ट करने की आवश्यकता है। struct.unpack ("

11

struct ठीक है यदि आपको एक या छोटी संख्या में 2-बाइट स्ट्रिंग को पूर्णांक में परिवर्तित करना है, लेकिन array और numpy स्वयं बेहतर विकल्प हैं। विशेष रूप से, numpy.fromstring (उपयुक्त तर्क के साथ बुलाया जाता है) सीधे आपकी स्ट्रिंग से बाइट को एक सरणी में परिवर्तित कर सकता है (जो भी dtype है)। (यदि numpy.little_endian गलत है, तो आपको बाइट्स को स्वैप करना होगा - अधिक चर्चा के लिए here देखें, लेकिन मूल रूप से आप fromstring के साथ बनाए गए सरणी ऑब्जेक्ट पर byteswap विधि को कॉल करना चाहते हैं)।

+0

यह जानना वाकई अच्छा है, मैं संरचना समाधान के साथ जाने जा रहा हूं, इसलिए मैं नहीं करता मैन्युअल रूप से एंडियंस को सही करने के बारे में चिंता करने की आवश्यकता नहीं है। –

+2

यदि आप जल्दी नहीं हैं, या आपके पास बहुत कम डेटा पॉइंट हैं, तो यह ठीक है। अन्यथा, आप 'dtype' के हिस्से के रूप में एक स्ट्रिंग के रूप में endianness को _can_ को संहिताबद्ध करते हैं (हालांकि मुझे विवरण बंद नहीं है)। –