2009-12-11 14 views
15

में कनवर्ट करें मैं सॉकेट से बाइट सरणी/सूची में पढ़ रहा हूं। मैं पाइथन को पहले बाइट को "हस्ताक्षरित 8 बिट पूर्णांक" के रूप में मानना ​​चाहता हूं। एक एकीकृत 8 बिट पूर्णांक के रूप में इसके पूर्णांक मान को कैसे प्राप्त करना संभव है?पाइथन बाइट को "हस्ताक्षरित 8 बिट पूर्णांक"

+1

यदि आप 'numpy' पर निर्भरता लेने के इच्छुक हैं, तो उनके कुछ कार्य एक' dtype' arg लेते हैं, जिसे आप 'numpy.uint8' पर सेट कर सकते हैं। उदाहरण: 'bytestream = numpy.fromfile (infile, dtype = numpy.uint8)' – CrazyPyro

उत्तर

21

struct मॉड्यूल का उपयोग करें।

import struct 
value = struct.unpack('B', data[0])[0] 

ध्यान दें कि हमेशा खोल एक टपल देता है, भले ही आप केवल एक आइटम खोल रहे हैं।

इसके अलावा, this SO question पर एक नज़र डालें।

+0

क्या आप दिखा सकते हैं कि कैसे? – bbb

+0

तो struct.unpack ('B', डेटा [0]) में संग्रहीत क्या है [1]? – bbb

+0

डेटा [0] आपको प्राप्त करने वाला पहला बाइट है। अनपैक ("बी", डेटा [0]) बाइट को 8-बिट हस्ताक्षरित पूर्णांक (जिसे सी में हस्ताक्षरित चार के रूप में जाना जाता है) के रूप में माना जाता है और उस पूर्णांक वाले टुपल को लौटाता है (क्या आपने अनपॅक करने के लिए दो बाइट पास किए थे, तो आप अनपॅक की तरह कुछ करेंगे ("बीबी", डेटा [0: 2]) और 2-टुपल वापस प्राप्त करें)। अंतिम [0] ट्यूपल में पहली (और केवल) वस्तु प्राप्त करता है। – codeape

7

बाइट्स/बाइटियर्रे पूर्णांक का अनुक्रम है। तुम सिर्फ अपने सूचकांक से एक तत्व तक पहुंचते हैं तो आप एक पूर्णांक होगा:

>>> b'abc' 
b'abc' 
>>> _[0] 
97 

उनके बहुत परिभाषा के अनुसार, बाइट्स और bytearrays range(0, 256) में पूर्णांक होते हैं। तो वे "अप्रमाणित 8-बिट पूर्णांक" हैं।

+0

उदाहरण के लिए, मैं अपने सर्वर साइड कोड में इस राशि डेटा = conn.recv (1000000) रूप में लंबे समय के रूप में मैं मैं समझता हूँ बाइट प्राप्त करें ... इसलिए मैं डेटा [0] को "हस्ताक्षरित 8 बिट पूर्णांक" के रूप में माना जाना चाहता हूं। यह कैसे संभव है? – bbb

+0

यह केवल पायथन 3.x में काम करता है। पायथन 2.6 में b'string literal 'वाक्यविन्यास है, लेकिन यह केवल str के लिए एक उपनाम है, और पुराने संस्करण आपको एक सिंटेक्स त्रुटि प्रदान करेंगे। – musicinmybrain

+0

@musicinmybrain: यही कारण है कि इस प्रश्न को 'पायथन-3.x' के रूप में टैग किया गया है, मुझे लगता है कि – SilentGhost

7

एक और बहुत ही उचित और सरल विकल्प है, अगर आप सिर्फ पहली बाइट के पूर्णांक मान की जरूरत है, निम्नलिखित की तरह कुछ होगा:

value = ord(data[0]) 

आप एक साथ अपने प्राप्त डेटा के सभी तत्वों के खोल चाहते हैं (और वे केवल एक सजातीय सरणी नहीं हैं), या यदि आप 32-बिट पूर्णांक जैसे मल्टीबाइट ऑब्जेक्ट्स से निपट रहे हैं, तो आपको स्ट्रक्चर मॉड्यूल की तरह कुछ उपयोग करने की आवश्यकता होगी।

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