2016-05-25 9 views
1

ich eine C-Funktion haben, die eine C-Struktur füllt:C char name [8] zu golang Name [8] Byte

typedef struct { 
    char name[8]; 
} 

Ich muss die Daten in Go lang Struktur kopieren, die den gleichen Inhalt hat :

type sData struct { 
    Name [8]byte 
} 

Die Struktur hat die Parameter von mehreren Größen: 4, 12, 32, so wäre es schön, eine Funktion zu haben, als nur eine Größe mit mehr beschäftigt.

dank

+0

Sind die Strukturen benötigen eine äquivalente Speicherlayout haben, oder können Sie 'Name: [] byte'? – JimB

+0

Es tut mir leid, die Struktur ist nur ein Kontext. Ich muss nur Daten von C go Datentyp von char [8] konvertieren, um Datentyp [8] Byte zu gehen, so dass ich c-Struktur verwerfen und mit go-Struktur arbeiten kann. –

+0

Die Größe der Char-Arrays ist festgelegt, da sie einige vordefinierte Daten im EEPROM darstellen. Es wäre schön, feste Größe in GO-Struktur zu haben. –

Antwort

1

Um dies ein wenig mehr Generika, das Sie den C-char-Array zu einem *C.char zersetzen können, dann unsafe.Pointer verwenden Sie es zurück in ein Array zu werfen.

func charToBytes(dest []byte, src *C.char) { 
    n := len(dest) 
    copy(dest, (*(*[1024]byte)(unsafe.Pointer(src)))[:n:n]) 
} 

Oder vielleicht ein wenig leichter

func charToBytes(src *C.char, sz int) []byte { 
    dest := make([]byte, sz) 
    copy(dest, (*(*[1024]byte)(unsafe.Pointer(src)))[:sz:sz]) 
    return dest 
}