Tôi có một byte.Buffer mà tôi đóng gói với dữ liệu bằng cách sử dụng hàm binary.Write(). Sau đó tôi cần gửi mảng byte này đến một hàm C. Sử dụng Go 1.6 Tôi đã không thành công trong việc tìm ra điều này.Chuyển đổi Go [] byte sang C * char
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
Nó thất bại trên dòng gọi hàm C nói:
panic: runtime error: cgo argument has Go pointer to Go pointer
Chức năng C:
int the_function(const void *data, int nbytes);
tôi đã có thể nhận được như sau để làm việc, nhưng nó cảm thấy sai chuyển đổi mảng byte thành chuỗi. Có cách nào tốt hơn để làm điều này? Phương pháp này có gây rủi ro tác dụng phụ cho dữ liệu không?
addr := unsafe.Pointer(C.CString(string(buf.Bytes()[0]))
Một lần nữa, điều này cần phải làm việc trong Go 1.6, giới thiệu quy tắc con trỏ cgo nghiêm ngặt hơn.
Cảm ơn bạn.
chuyển [] byte thành chuỗi c có thể không phải là một ý kiến hay. Bởi vì '\ 0' trong byte [] sẽ kết thúc chuỗi c, và độ dài của chuỗi c có thể không bằng chiều dài của byte [] gốc. –
@ bronzeman: rõ ràng, nhưng hàm trong câu hỏi có độ dài bộ đệm làm đối số và không mong đợi một chuỗi bị hủy. 'C.CString' thêm byte null nếu nó cần thiết, nhưng chúng ta bỏ qua nó bằng cách truyền độ dài chuỗi chính xác. – JimB