2009-11-14 14 views
9

पायथन में मैं इसे एक स्ट्रिंग में पढ़कर और struct.unpack(...) का उपयोग करके एक बाइनरी फ़ाइल तक पहुंच रहा हूं। अब मैं struct.pack_into(...) का उपयोग कर उस स्ट्रिंग को लिखना चाहता हूं, लेकिन मुझे त्रुटि त्रुटि मिलती है "स्ट्रिंग का उपयोग संशोधित बफर के रूप में नहीं कर सकता"struct मॉड्यूल के साथ उपयोग के लिए उपयुक्त बफर क्या होगा?पायथन के स्ट्रक्चर मॉड्यूल के लिए उपयुक्त बफर क्या है

+0

आप किस पायथन का उपयोग कर रहे हैं? मैंने structs के साथ थोड़ा सा खेला है लेकिन हेवन 'पहले देखा था। – chrism1

+0

मैं पाइथन 2.6.4 – mdm

उत्तर

6

यदि आप इसे किसी विशिष्ट ऑब्जेक्ट में पैक करने की कोशिश नहीं कर रहे हैं, तो बस स्ट्रिंग को वापस करने के लिए struct.pack का उपयोग करें।

अन्यथा, ctypes.create_string_buffer एक परिवर्तनीय बफर प्राप्त करने का एक तरीका है।

+0

का उपयोग कर रहा हूं बफर एक साधारण आभासी मशीन के लिए स्मृति है, इसलिए मुझे एक विशिष्ट वस्तु में पैक करने की आवश्यकता है। स्मृति छोटी है लेकिन एकल स्मृति पहुंच के लिए 128-512k की प्रतिलिपि बनाना एक विकल्प नहीं है। – mdm

6

जैसा कि एक अन्य उत्तर में उल्लेख किया गया है, struct_pack शायद आपको चाहिए और उपयोग करना चाहिए। हालांकि, प्रकार array की वस्तुओं बफर प्रोटोकॉल का समर्थन और संशोधित किया जा सकता:

>>> import array, struct 
>>> a = array.array('c', ' ' * 1000) 
>>> c = 'a'; i = 1 
>>> struct.pack_into('ci', a, -0, c, i) 
>>> a 
array('c', 'a\x00\x00\x00\x01\x00\x00\x00 ... 

मूल बफर प्रोटोकॉल मुख्य रूप से सी एक्सटेंशन के लिए हैक का एक सा था। इसे हटा दिया गया है और पाइथन 3 (और आने वाले 2.7 में) new C-level buffer API and memoryview objects द्वारा प्रतिस्थापित किया गया है।

-1

दो संभावनाओं दिमाग में तुरंत छलांग:

  • आप/पढ़ने बनाने फ़ाइल अर्थ विज्ञान के साथ बफ़र लिखने के लिए अजगर stringio मॉड्यूल का उपयोग कर सकते हैं।

  • आप एक बफर प्राप्त करने के लिए पाइथन array मॉड्यूल का उपयोग कर सकते हैं, जिसमें आप एक सूची की तरह इलाज कर सकते हैं, लेकिन इसमें केवल बाइनरी बाइट्स होंगे।

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