2015-08-26 6 views
5

मैं पूर्णांक पता निकालना चाहता हूं जो ctypes.c_char_p उदाहरण बिंदुओं को निकालने के लिए है।ctypes.c_char_p उदाहरण के सूचक पते को कैसे प्राप्त करें

उदाहरण के लिए,

>>> import ctypes 
>>> s = ctypes.c_char_p("hello") 
>>> s 
c_char_p(4333430692) 

मूल्य मैं लाने के लिए चाहते हैं, उसमें ४३३३४३०६९२ है - स्मृति में स्ट्रिंग hello\0 का पता:

(lldb) x 4333430692 
0x1024ae7a4: 68 65 6c 6c 6f 00 5f 70 00 00 00 00 05 00 00 00 hello._p........ 

मैं ctypes पढ़ा है दस्तावेज़, लेकिन ऐसा करने का कोई तरीका नहीं प्रतीत होता है। निकटतम ctypes.addressof है, लेकिन यह केवल मुझे पॉइंटर का स्थान देता है।

मुझे यह कारण क्यों है क्योंकि मैं कुछ सी कार्यों को बुला रहा हूं जो वास्तव में पूर्णांक के रूप में एन्कोड किए गए कच्चे पते की अपेक्षा करते हैं (जिसका आकार मूल सूचक चौड़ाई के बराबर है)।

+0

समारोह प्रोटोटाइप 'intptr_t' या' int64_t' का उपयोग कर सकते हैं, लेकिन वह 'c_char_p' ctypes में उपयोग करने से रोक नहीं करता है। एक 'char * 'सूचक एक पूर्णांक पते के रूप में पारित किया जाता है। – eryksun

+0

निश्चित रूप से, लेकिन मेरे लिए उपयोग का मामला थोड़ा अलग है: मैं जिंगिंग कोड हूं और पते को एक इंटरमीडिएट पायथन फ़ंक्शन में पास करने की आवश्यकता है जो पूर्णांक की अपेक्षा करता है, जो तब एक सी फ़ंक्शन में कॉल को इकट्ठा करता है। मैं इसका उल्लेख करने में असफल रहा। – csl

उत्तर

6

तुम बस c_void_p करने के लिए इसे डाली सकता है और मूल्य मिलता है:

>>> ctypes.cast(s, ctypes.c_void_p).value 
4333430692 
+0

आह, मैंने इसे 'c_int64' पर कास्ट करने का प्रयास किया! धन्यवाद! – csl

+4

वैकल्पिक रूप से, बफर प्रोटोकॉल का उपयोग करें: 'ctypes.c_void_p.from_buffer (val) .value'। 'से_बफर' का उपयोग करना लगभग 3 गुना तेज है क्योंकि एफएफआई कॉल का उपयोग करके 'कास्ट' लागू किया गया है। लेकिन इससे कोई फर्क नहीं पड़ता कि आपको लाखों बार एक तंग लूप में ऐसा करना होगा जो कुछ भी नहीं करता है। – eryksun

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