Ho un byte.Buffer che impacchetta con i dati usando la funzione binary.Write(). Devo quindi inviare questo array di byte a una funzione C. Usando Go 1.6 Non ho avuto successo nel capire questo.Converti Go [] byte in un 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
Non riesce sulla linea chiamando la funzione C dicendo:
panic: runtime error: cgo argument has Go pointer to Go pointer
La funzione C:
int the_function(const void *data, int nbytes);
sono stato in grado di ottenere la seguente al lavoro, ma si sentiva male convertire l'array di byte in una stringa. C'è un modo migliore per farlo? Questo metodo rischia effetti collaterali ai dati?
addr := unsafe.Pointer(C.CString(string(buf.Bytes()[0]))
Anche in questo caso, è necessario lavorare in Go 1.6 che ha introdotto regole di puntatore cgo più rigide.
Grazie.
converting [] byte in una stringa c potrebbe non essere una buona idea. Poiché '\ 0' nel byte [] termina la stringa c e la lunghezza della stringa c potrebbe non essere uguale alla lunghezza del byte di origine []. –
@bronzeman: ovviamente, ma la funzione in questione prende la lunghezza del buffer come argomento e non si aspetta una stringa terminata null. 'C.CString' aggiunge il byte null se necessario, ma lo saltiamo passando la lunghezza esatta della stringa. – JimB