2011-09-11 12 views
46

मैं पाइथन में बाइट सरणी (जैसे जावा में बाइट []) का प्रतिनिधित्व कैसे कर सकता हूं? मुझे इसे गीवेन्ट के साथ तार पर भेजने की आवश्यकता होगी।बाइट ऐरे

byte key[] = {0x13, 0x00, 0x00, 0x00, 0x08, 0x00}; 

उत्तर

45

अजगर 3 में, हम bytes वस्तु, भी अजगर 2 में str रूप में जाना जाता

# Python 3 
key = bytes([0x13, 0x00, 0x00, 0x00, 0x08, 0x00]) 

# Python 2 
key = ''.join(chr(x) for x in [0x13, 0x00, 0x00, 0x00, 0x08, 0x00]) 

मैं इसे और अधिक सुविधाजनक base64 मॉड्यूल का उपयोग करने के लिए लगता है ... का उपयोग

# Python 3 
key = base64.b16decode(b'130000000800') 

# Python 2 
key = base64.b16decode('130000000800') 

आप साहित्य का भी उपयोग कर सकते हैं ...

# Python 3 
key = b'\x13\0\0\0\x08\0' 

# Python 2 
key = '\x13\0\0\0\x08\0' 
+4

रिकॉर्ड के लिए, बजाय 'बेस 64 की। बी 16 डीकोड (एक्स) ', आप आसानी से' x.decode ("हेक्स") का उपयोग कर सकते हैं। यह आपको कम से कम एक कम आयात के साथ प्राप्त करने देता है। :) – Dolda2000

2

डाइट्रिच का जवाब शायद आपके द्वारा वर्णित, बाइट भेजने के लिए आवश्यक चीज़ है, लेकिन उदाहरण के लिए आपके द्वारा प्रदान किए गए कोड के करीब एनालॉग bytearray प्रकार का उपयोग करेगा।

>>> key = bytearray([0x13, 0x00, 0x00, 0x00, 0x08, 0x00]) 
>>> bytes(key) 
b'\x13\x00\x00\x00\x08\x00' 
>>> 
+0

पाइथन 2.5 या उससे पहले के लिए ठीक है, लेकिन अंतर्निहित 'बाइटियर' वास्तव में जाने का तरीका है यदि आप चाहते हैं, एर, एक बाइट सरणी। –

+0

@ टोकनमैकगुय: आपके उत्तर को 2 और संपादन की आवश्यकता है: (1) सरणी मॉड्यूल (2) 'bytearray ('b', ...) का उल्लेख नहीं करता है। या आप इसे हटा सकते हैं। –

+1

@ जॉन: धन्यवाद, तय। भविष्य में, बस आगे बढ़ें और संपादन स्वयं करें। – SingleNegationElimination

24

बस एक bytearray (अजगर 2.6 और बाद में) जो बाइट्स की एक अस्थायी अनुक्रम

>>> key = bytearray([0x13, 0x00, 0x00, 0x00, 0x08, 0x00]) 
>>> key 
bytearray(b'\x13\x00\x00\x00\x08\x00') 

अनुक्रमण पाने का प्रतिनिधित्व करता है और अलग-अलग बाइट्स सेट

>>> key[0] 
19 
>>> key[1]=0xff 
>>> key 
bytearray(b'\x13\xff\x00\x00\x08\x00') 

और प्रयोग आप इसे की जरूरत है str (या bytes पायथन 3 में) के रूप में, यह

जितना आसान है
>>> bytes(key) 
'\x13\xff\x00\x00\x08\x00' 
+0

3.x के साथ इतना आसान नहीं है; 'fubar = str (कुंजी); प्रिंट (लेन (कुंजी), लेन (फ्यूबर)) '' 38 38 'पैदा करता है। किसी भी मामले में (1) "स्ट्रिंग" बहुत अस्पष्ट शब्दावली है (2) यदि वह उत्परिवर्तन चाहता है, तो वह अपनी मूल ** सूची ** –

+0

@ जॉन को बदल सकता है: पायथन 3 में 'बाइटियर' के लिए अलग-अलग काम करने के बारे में अच्छा बिंदु 'str' - तय मैंने मुख्य रूप से इसे 'बाइट्स' से अलग करने के लिए उत्परिवर्तन का उल्लेख किया है, लेकिन यह भी मुद्दा है कि आपको 'डेटा' में अपना डेटा रखने का मध्यवर्ती चरण नहीं होना चाहिए। –

+2

यह एक उचित मौका है कि ओपी को वास्तव में क्या चाहिए, 'struct.pack ("

5

एक वैकल्पिक भी आसानी से इसके उत्पादन प्रवेश करने के अतिरिक्त लाभ है कि:

hexs = "13 00 00 00 08 00" 
logging.debug(hexs) 
key = bytearray.fromhex(hexs) 

तुम इतनी तरह आसान प्रतिस्थापन करने के लिए अनुमति देता है:

hexs = "13 00 00 00 08 {:02X}".format(someByte) 
logging.debug(hexs) 
key = bytearray.fromhex(hexs) 
संबंधित मुद्दे