मेरे पास एक बाइट है। बफर जो मैं बाइनरी। राइट() फ़ंक्शन का उपयोग कर डेटा के साथ पैक करता हूं। मुझे फिर इस बाइट सरणी को सी फ़ंक्शन में भेजने की आवश्यकता है। गो 1.6 का उपयोग करना मैं इसे समझने में सफल नहीं रहा हूं।कनवर्ट करें [] बाइट को सी * char
panic: runtime error: cgo argument has Go pointer to Go pointer
सी समारोह:
int the_function(const void *data, int nbytes);
मैं प्राप्त करने में सक्षम था काम करने के लिए निम्नलिखित है, लेकिन यह गलत महसूस किया
buf := new(bytes.Buffer) //create my buffer
....
binary.Write(buf, binary.LittleEndian, data) //write my data to buffer here
addr := (*C.uchar)(unsafe.Pointer(&buf.Bytes()[0])) //convert buffers byte array to a C array
rc := C.the_function(addr, C.int(buf.Len())) //Fails here
यह सी समारोह बुला लाइन कह पर विफल रहता है बाइट सरणी को एक स्ट्रिंग में परिवर्तित करना। क्या ऐसा करने के लिए इससे अच्छा तरीका है? क्या यह विधि डेटा पर साइड इफेक्ट्स का जोखिम उठाती है?
addr := unsafe.Pointer(C.CString(string(buf.Bytes()[0]))
फिर इसे गो 1.6 के तहत काम करने की आवश्यकता है जो कठोर कागो सूचक नियम पेश करता है।
धन्यवाद।
कनवर्ट करना [] बाइट एक सी स्ट्रिंग में एक अच्छा विचार नहीं हो सकता है। चूंकि [] '[0] में [] बाइट सी स्ट्रिंग को समाप्त कर देगा, और सी स्ट्रिंग की लंबाई उत्पत्ति [] बाइट की लंबाई के बराबर नहीं हो सकती है। –
@bronzeman: जाहिर है, लेकिन प्रश्न में कार्य बफर की लंबाई को तर्क के रूप में लेता है, और एक शून्य समाप्त स्ट्रिंग की अपेक्षा नहीं कर रहा है। यदि सी की आवश्यकता होती है तो 'सीसीस्ट्रिंग 'शून्य बाइट जोड़ता है, लेकिन हम सटीक स्ट्रिंग लंबाई को पार करके इसे छोड़ देते हैं। – JimB