2011-09-26 22 views
21

मुझे कच्चे बाइनरी डेटा के साथ एक टीसीपी फ्रेम बनाने की आवश्यकता है, लेकिन बाइट्स के बारे में बात करने वाले सभी उदाहरणों और ट्यूटोरियल में हमेशा एक स्ट्रिंग से रूपांतरण शामिल होता है, और यह मेरी आवश्यकता नहीं है।पायथन 3 बाइट्स की एक सरणी बनाना

संक्षेप में, मैं सिर्फ बाइट्स की एक सरणी का निर्माण करने की जरूरत है:

0xA2 0x01 0x02 0x03 0x04

कृपया ध्यान दें कि मैं C/C++ दुनिया से आते हैं।

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

frame = b"" 
frame += bytes(int('0xA2',16)) 
frame += bytes(int('0x01',16)) 
frame += bytes(int('0x02',16)) 
frame += bytes(int('0x03',16)) 
frame += bytes(int('0x04',16)) 

फिर, सॉकेट की विधि भेजने के लिए इस फ्रेम चर फेंक, लेकिन काम नहीं कर के रूप में फ्रेम के रूप में की उम्मीद शामिल नहीं है जो मैं चाहता ...

मुझे पता है कि यह पाइथन के बारे में एक बहुत ही बुनियादी सवाल है, इसलिए यदि आप मुझे सही दिशा में इंगित कर सकते हैं ...

+3

उपर्युक्त कोड के साथ समस्या यह है कि सूची के बजाय पूर्णांक दिए जाने पर 'बाइट्स' बहुत अलग तरीके से व्यवहार करता है। आपको 'फ्रेम + = बाइट्स ([int ('0xa2', 16)] का उपयोग करना चाहिए)। –

+0

मुझे पता है कि आप गतिशील रूप से ऐसा करने के लिए (ed) चाहते हैं, लेकिन पूरी तरह अस्पष्ट क्या है: इनपुट बाइट कहां से आते हैं? आप टेक्स्ट फ़ाइल से हेक्स नोटेशन पढ़ते हैं? आप स्रोत कोड में प्रत्येक बाइट लिखते हैं? क्या आप उन्हें एक बाइटरीरे में रखते हैं जिसे आपने बाइनरी से बाइनरी पढ़ने से प्राप्त किया है? –

उत्तर

27

उपयोग फ्रेम (पैकेट) भेज सकते हैं एक bytearray:

>>> frame = bytearray() 
>>> frame.append(0xA2) 
>>> frame.append(0x01) 
>>> frame.append(0x02) 
>>> frame.append(0x03) 
>>> frame.append(0x04) 
>>> frame 
bytearray(b'\xa2\x01\x02\x03\x04') 

या, अपने कोड का उपयोग लेकिन फिक्सिंग त्रुटियों:

frame = b"" 
frame += b'\xA2' 
frame += b'\x01' 
frame += b'\x02' 
frame += b'\x03' 
frame += b'\x04' 
+0

आपने प्रश्न के अनुसार टैग को टैग किया है जब उत्तर समाधान के रूप में इसका उपयोग नहीं कर सकता है। –

+0

@clinisbut यह अभी भी संबंधित है - सामान्य अर्थ में, आप एक बाइट सरणी (अवधारणा) का उपयोग कर रहे हैं भले ही आप 'bytearray' प्रकार का उपयोग नहीं कर रहे हों। मेरे उत्तर में दो तरीकों में से किसी एक को आपकी समस्या का समाधान करना चाहिए। – agf

+0

आप 'bytearray'with 'बाइट्स' को प्रतिस्थापित कर सकते हैं और लगभग उसी परिणाम प्राप्त कर सकते हैं। एक 'bytearray' हालांकि एक म्यूटेबल प्रकार है, इसलिए यह आपके फ्रेम बनाने के लिए' बाइट्स 'से अधिक उपयोगी हो सकता है। –

0

मुझे लगता है कि स्कापी आप क्या देख रहे हैं।

http://www.secdev.org/projects/scapy/

आप का निर्माण और के साथ यह

+1

धन्यवाद, लेकिन मुझे यह सीखने में अधिक दिलचस्पी है कि इसे कैसे करें;) –

+0

ठीक है, सामान्य नेटवर्क और पैकेट परियोजनाओं के लिए स्कैपी सिर्फ एक अच्छा टूल है। मुझे लगता है कि आप जो खोज रहे हैं वह इस तरह है: > >>> संरचना आयात से * > >>>>>> पैकेट = पैक ('बीबीबीबीबी', 162,1,2,3,4,) > >>> पैकेट > '\ xa2 \ x01 \ x02 \ x03 \ x04' – Venec

+0

मुझे विश्वास नहीं है, मैं अपनी समस्या को अजगर के साथ हल करना चाहता हूं। –

10

बस एक फ्रेम से अपने फ्रेम का निर्माण करने के बारे में क्या ndard सूची?

frame = bytes([0xA2,0x01,0x02,0x03,0x04]) 

bytes() निर्माता एक iterable int मूल्यों से युक्त से एक बाइट फ्रेम बना सकते हैं। एक iterable जो कुछ भी इटरेटर प्रोटोकॉल लागू करता है: एक सूची, पुनरावर्तक, क्या range() द्वारा दिया जाता है की तरह एक iterable वस्तु ...

6
frame = b'\xa2\x01\x02\x03\x04' 

अब तक mentionned नहीं था ...

+0

लेकिन मुझे गतिशील रूप से फ्रेम बनाने की आवश्यकता है –

+1

बाइट्स की सरणी बनाने के लिए यह वाक्यविन्यास एक स्ट्रिंग प्रकार के समान काम करता है: आप अपने बाइट सरणी को गतिशील रूप से बनाने के लिए '+' या अन्य समान ऑपरेटरों का उपयोग कर सकते हैं। –

2

एजीएफ़ के bytearray समाधान व्यावहारिक है, लेकिन यदि आपको खुद को बाइट्स के अलावा डेटाटाइप का उपयोग करके अधिक जटिल पैकेट बनाने की आवश्यकता है, तो आप struct.pack() आज़मा सकते हैं। http://docs.python.org/release/3.1.3/library/struct.html

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