पर बाहरी रूप से प्रदत्त बफर की प्रतिलिपि बनाने का सबसे प्रभावी तरीका क्या है, मैं ctypes का उपयोग कर बाहरी पुस्तकालय में इंटरफेसिंग कर रहा हूं। यह पुस्तकालय मुझे एक बाइनरी बफर लौटाता है। इंटरफ़ेस इस तरह दिखता है:बाइट्स
int getBuff(unsigned char **buf, int *len);
मैं बफर जब मैं इसके साथ किया हूँ मुक्त ताकि सकता है, लेकिन है कि पहलू मेरे लिए कोई समस्या नहीं प्रस्तुत करता है, तो मुझे नहीं लगता कि हम क्या ज़रूरत है पुस्तकालय भी एक deallocator निर्यात करता है इसे कवर करने के लिए।
मेरे ctypes कोड में मैं buf
तर्क c_void_p
के रूप में प्रतिनिधित्व कर रहा हूं। मैं इस बफर को बाइट्स ऑब्जेक्ट में यथासंभव कुशलतापूर्वक कॉपी करना चाहता हूं।
फिलहाल मेरे पास है:
data = bytes(bytearray(ctypes.cast(buf, ctypes.POINTER(ctypes.c_ubyte*len.value))[0]))
जहां buf
c_void_p
और len
है c_int
है।
जैसा कि मैं इसे समझता हूं, यह दो प्रतियां करता है। एक बार bytearray ऑब्जेक्ट, और फिर बाइट्स ऑब्जेक्ट के लिए।
मैं इसे केवल एक ही प्रति के साथ कैसे कर सकता हूं?
मेरे वर्तमान प्रयासों ने पाइथन 2 पर ध्यान केंद्रित किया है, लेकिन निश्चित रूप से मुझे इसे पायथन 3 के लिए भी समर्थन देना होगा।
पायथन 3 पर, आपको केवल 'बाइटियर' कॉल को हटाने में सक्षम होना चाहिए। – user2357112
आप 'bu_ = POINTER (c_char)' की बजाय कलाकार के साथ 'c_void_p' का उपयोग क्यों कर रहे हैं? फिर 'GetBuff (byref (buf), byref (len)) 'और' data = buf [: len.value] '। – eryksun
@ एरिक्सन: हू। आप एक ctypes सूचक टुकड़ा कर सकते हैं? मेरे लिए समाचार – user2357112