2014-12-17 3 views
5

Wie konvertiere ich diese C (Array) Typ:Wie konvertiert [1024] C.char auf [1024] Byte

char my_buf[BUF_SIZE]; 

dieser Go (Array) Typ:

type buffer [C.BUF_SIZE]byte 

? Der Versuch, eine Schnittstelle Umwandlung zu tun gibt mir diese Fehlermeldung:

cannot convert (*_Cvar_my_buf) (type [1024]C.char) to type [1024]byte 

Antwort

8

Der einfachste und sicherste Weg ist es zu einer Scheibe zu kopieren, nicht speziell auf [1024]byte

mySlice := C.GoBytes(unsafe.Pointer(&C.my_buff), C.BUFF_SIZE) 

Um den Speicher direkt ohne eine Kopie zu verwenden Sie können es durch eine unsafe.Pointer "werfen".

mySlice := (*[1 << 30]byte)(unsafe.Pointer(&C.my_buf))[:int(C.BUFF_SIZE):int(C.BUFF_SIZE)] 
// or for an array if BUFF_SIZE is a constant 
myArray := *(*[C.BUFF_SIZE]byte)(unsafe.Pointer(&C.my_buf)) 
+0

Ich mag speziell einen Array, nicht eine Scheibe . Einer der Gründe ist, dass ich eine Kopie machen möchte. Außerdem ist 'C.BUF_SIZE' * * eine Konstante, also kann ich sie in einem typedef verwenden. Warum auch, um es in einen Zeiger auf ein riesiges Array umzuwandeln? –

+2

Das riesige Array ist nur so, dass der Go-Compiler jede gültige Größe akzeptiert, aber nicht wirklich zugewiesen ist (siehe einige andere Beispiele hier https://github.com/golang/go/wiki/cgo). – JimB

+0

Aah, ich sehe jetzt, dass du es verdeckst, vergiss es. –

2

Um eine Go Scheibe mit dem Inhalt C.my_buf zu erstellen:

arr := C.GoBytes(unsafe.Pointer(&C.my_buf), C.BUF_SIZE) 

einen Go-Array erstellen ...

var arr [C.BUF_SIZE]byte 
copy(arr[:], C.GoBytes(unsafe.Pointer(&C.my_buf), C.BUF_SIZE)) 
+1

@ JimB Das zweite Beispiel scheint für mich zu funktionieren. Hier ist ein Beispiel https://play.golang.org/p/O49FFSyHCG (lokal testen) Welchen Fehler bekommen Sie? Ich laufe go1.4 auf einem Mac. – tidwall

+0

Ah, ich habe nie überprüft, ob cgo 'DEFINE' als Konstante behandelt hat. Das funktioniert in diesem Fall. – JimB

+1

FYI, das zweite Beispiel kopiert die Daten zweimal. – JimB

Verwandte Themen