2014-11-19 16 views
8

बाइट्स मैं एक बाइट वस्तु है?python3 हेक्स स्ट्रिंग

"067b" 

मैं कोशिश की है: इस तरह

In [3]: str(a) 
Out[3]: "b'067b'" 

In [4]: import codecs 

In [5]: codecs.decode(a,'hex') 
Out[5]: b'\x06{' 

In [6]: import binascii 

In [7]: binascii.b2a_hex(a) 
Out[7]: b'30363762' 

In [8]: binascii.hexlify(a) 
Out[8]: b'30363762' 

वहाँ कोई रास्ता नहीं यह करने के लिए है?

उत्तर

8

आप बस यहाँ ASCII से डिकोड करने के लिए चाहते हैं, अपने bytestring, पहले से ही हेक्साडेसिमल संख्याओं का प्रतिनिधित्व करती हैं ASCII वर्ण में:

>>> a = b'067b' 
>>> a.decode('ascii') 
'067b' 

आप जो कुछ भी करने की कोशिश की बजाय संख्यात्मक डेटा के रूप में बाइट्स की व्याख्या है, या तो हेक्साडेसिमल संख्याओं के रूप में बाइट्स या संख्यात्मक डेटा का प्रतिनिधित्व करने वाले बाइट्स का प्रतिनिधित्व करते हैं।

तो अपने पहले ही प्रयास एक हेक्साडेसिमल संख्या के रूप में मूल्य 06 लेता है और कि बाइट मूल्य 6, और 7b में बाइट मूल्य 123 है, जो { चरित्र के लिए ASCII कोडपॉइंट है में बदल गया है बदल जाता है।

अपने दूसरे प्रयास में आप प्रत्येक बाइट को अपने सांख्यिक मूल्य के हेक्साडेसिमल प्रतिनिधित्व में परिवर्तित कर रहे हैं। 0 बाइट पूर्णांक संख्या 48 ('0' चरित्र के लिए ASCII कोडपॉइंट) है, जो हेक्साडेसिमल में 30 के रूप में स्वीकार किया जा रहा। '6' हेक्स, आदि में 54, या 36 है

+0

यह काम करता है, लेकिन मैं नहीं दिख रहा है कि कैसे 'b'067b'' ASCII है। क्या यह वास्तव में दो बाइट्स नहीं है, '06' और '7 बी'? अगर मुझे ASCII मानों के रूप में लिया जाता है तो वह मुझे वास्तव में 'x x6 {' देगा। वास्तव में यहाँ क्या चल रहा है? – MightyPork

+0

@MightyPork: नहीं, यह ** चार ** बाइट्स है। वर्ण '0',' 6', '7' और' बी'। 'बी' ... '' शाब्दिक नोटेशन हेक्साडेसिमल वर्ण नहीं लेता है, यह ASCII वर्ण लेता है। –

+0

ओह ठीक है, उलझन में। – MightyPork

6

bytes प्रतिनिधित्व भ्रमित हो सकता है। b'0607'bytes([0x06,0x07] जैसा नहीं है)। b'0607' वास्तव में 4 बाइट [48,54,48,55] जहां 48 0 के लिए ascii कोड, आदि है।

[x for x in b'0607'] 
[48, 54, 48, 55] 

ऐसे b'0607' के रूप में पहले से ही एक ascii स्ट्रिंग लेकिन bytes के रूप में प्रतिनिधित्व करता है, तो आप इसे str आप (b'0607'.decode("ascii") करने की जरूरत है, ताकि आपको उन बाइट्स उन्हें ascii कोड की तरह व्याख्या से एक str के निर्माण के लिए यह परिवर्तित करना चाहते हैं (जैसा कि है वे कर रहे हैं))।

सामान्य में, अगर आप इस तरह हेक्स स्ट्रिंग के लिए bytes कन्वर्ट:

>>> a = binascii.hexlify(bytes([1,10,15,16,255])) 
>>> a 
b'010a0f10ff' 
>>> type(a) 
<class 'bytes'> 
>>> b = a.decode("ascii") 
>>> type(b) 
<class 'str'> 
संबंधित मुद्दे