2014-07-19 8 views
5

निम्नलिखित प्रश्न उठ गए क्योंकि मैं bytes स्ट्रिंग्स का उपयोग करने की कोशिश कर रहा था क्योंकि कुंजीपटल कुंजी और बाइट मान जिन्हें मैं बराबर समझा जाता था, को बराबर नहीं माना जा रहा था।बाइट लिटरल के पायथन तुलना

निम्नलिखित पायथन कोड बराबर की तुलना क्यों नहीं करता है - क्या ये दो द्विआधारी डेटा (उदाहरण के लिए जानबूझकर चुने गए हैं) के बराबर प्रतिनिधित्व नहीं हैं?

b'0b11111111' == b'0xff' 

मैं जानता हूँ कि निम्नलिखित सच का मूल्यांकन करता है, तुल्यता का प्रदर्शन:

int(b'0b11111111', 2) == int(b'0xff', 16) 

लेकिन अजगर बल मुझे प्रतिनिधित्व पता करने के लिए करता है? क्या यह एंडियन-नेस से संबंधित है? क्या इन सभी को परिवर्तित करने के अलावा अन्य समकक्ष तुलना करने के लिए इन्हें मजबूर करने का कोई आसान तरीका है। हेक्स अक्षर? क्या कोई भी (कुछ हद तक) प्लेटफ़ॉर्म स्वतंत्र तरीके से सभी प्रस्तुतियों के बीच स्थानांतरित करने के लिए एक पारदर्शी और स्पष्ट विधि सुझा सकता है (या मैं बहुत ज्यादा पूछ रहा हूं)?

संपादित करें:

नीचे टिप्पणी को देखते हुए, मैं वास्तव में सूचकांक एक शब्दकोश प्रपत्र b'0b11111111' में 8 बिट का उपयोग कर, तो क्यों अजगर यह दस बाइट्स का विस्तार करता है करना चाहते हैं और मुझे लगता है कि कैसे रोकूँ?

यह एक बड़े पेड़ डेटा संरचना का एक छोटा टुकड़ा है और 80 के कारक द्वारा मेरी अनुक्रमणिका का विस्तार करना स्मृति की एक बड़ी अपशिष्ट की तरह लगता है।

उत्तर

6

बाइट किसी भी चीज का प्रतिनिधित्व कर सकते हैं। पाइथन आपके बाइट्स को एन्कोड करने पर अनुमान लगा सकता है और नहीं अनुमान लगाएगा।

उदाहरण के लिए, int(b'0b11111111', 34)भी एक वैध व्याख्या है, लेकिन यह व्याख्या हेक्स एफएफ के बराबर नहीं है।

वास्तव में, व्याख्याओं की संख्या अंतहीन है। बाइट ASCII कोडपॉइंट्स, या छवि रंग, या संगीत नोट्स की एक श्रृंखला का प्रतिनिधित्व कर सकते हैं।

तक आप स्पष्ट रूप से एक व्याख्या लागू होते हैं, बाइट्स वस्तु होते सिर्फ 0-255 की सीमा में मूल्यों के अनुक्रम का, और उन बाइट्स की शाब्दिक प्रतिनिधित्व यदि ऐसा है तो प्रिंट करने योग्य पाठ के रूप में प्रदर्शनीय ASCII का उपयोग करें:

>>> list(bytes(b'0b11111111')) 
[48, 98, 49, 49, 49, 49, 49, 49, 49, 49] 
>>> list(bytes(b'0xff')) 
[48, 120, 102, 102] 

उन बाइट अनुक्रम बराबर नहीं हैं।

यदि आप इन अनुक्रमों को स्पष्ट रूप से पूर्णांक अक्षर के रूप में समझना चाहते हैं, तो का उपयोग डीकोडेड टेक्स्ट मानों की व्याख्या करने के लिए करें; हमेशा तुलना करने से पहले सामान्य:

>>> import ast 
>>> ast.literal_eval(b'0b11111111'.decode('utf8')) 
255 
>>> ast.literal_eval(b'0xff'.decode('utf8')) 
255 
+0

लेकिन क्या '0 बी' इंगित नहीं करता है कि 'बाइट्स' शाब्दिक का अर्थ है कि आप इसे कैसे समझते हैं, इस बारे में अनियंत्रित बाइनरी प्रतिनिधित्व होना चाहिए? –

+1

@ मैथ्यूहेमके: इसका मतलब है कि आपके पास बाइट वैल्यू 48 है जिसके बाद बाइट वैल्यू 98 है। ये * होता है * एएससीआईआई अक्षरों '0' और' बी' के रूप में व्याख्या करने योग्य है। –

+0

यदि ऐसा है, तो मैं कैसे बना सकता हूं ताकि मैं बाइट्स स्ट्रिंग को वास्तव में 1 बाइट बन सकूं जिसका मेरा मतलब है? –

4

b'0b11111111' 10 बाइट्स के होते हैं:

In [44]: list(b'0b11111111') 
Out[44]: ['0', 'b', '1', '1', '1', '1', '1', '1', '1', '1'] 

जबकि b'0xff' 4 बाइट के होते हैं:

In [45]: list(b'0xff') 
Out[45]: ['0', 'x', 'f', 'f'] 

जाहिर है, वे एक ही ऑब्जेक्ट नहीं है।

पायथन मूल्य स्पष्टता।(अंतर्निहित से स्पष्ट बेहतर है।) मानता है कि b'0b11111111' आवश्यक रूप से एक पूर्णांक का द्विआधारी प्रतिनिधित्व है। यह सिर्फ बाइट्स की एक स्ट्रिंग है। आप इसे कैसे समझना चुनते हैं इसे स्पष्ट रूप से बताया जाना चाहिए।

+0

वास्तविक बाइट तार हां, लेकिन वे जो डेटा प्रस्तुत करते हैं वह वही अधिकार है? या यह है कि बाइट तार स्वयं मूल्य बन जाते हैं जब उन्हें व्याख्या किया जाता है उदा। एक 'int (' ', आधार)' मूल्यांकन। –

+0

हां, बाइट स्ट्रिंग एक पूर्णांक मान के समान नहीं है। 'Int' फ़ंक्शन बाइट्स को 'int' में परिवर्तित करता है (और आधार निर्दिष्ट होना चाहिए)। – unutbu

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