C char name[8] to GoLang Name [8]byte

У меня есть функция C, которая заполняет структуру C:

typedef struct {
  char name[8];
}

Мне нужно скопировать данные в структуру Go lang с тем же содержимым:

type sData struct {
  Name [8]byte
}

Структура имеет параметры нескольких размеров: 4, 12, 32, поэтому было бы неплохо иметь функцию, которая работает с несколькими размерами.

Благодарность


person Sergei G    schedule 25.05.2016    source источник
comment
Должны ли структуры иметь эквивалентную структуру памяти, или вы можете использовать Name: []byte?   -  person JimB    schedule 25.05.2016
comment
Извините, структура - это просто контекст. Мне просто нужно преобразовать данные из типа данных C go типа char[8] в тип данных go [8]byte, чтобы я мог отказаться от структуры c и работать со структурой go.   -  person Sergei G    schedule 25.05.2016
comment
Размер массивов символов фиксирован, поскольку он представляет некоторые предопределенные данные в EEPROM. Было бы неплохо внести фиксированный размер в структуру GO.   -  person Sergei G    schedule 25.05.2016
comment
Вам решать, хотите ли вы использовать массив, но в Go уже есть функция copy для копирования смежных байтов.   -  person JimB    schedule 25.05.2016
comment
Мое текущее решение выглядит примерно так: func charToBytes(dest []byte, src [8]C.char) { buf := C.GoBytes(src, C.int(len(dest))) copy(dest, buf) }, но мне приходится писать новую функцию для каждого размера массива или вставлять код в строку.   -  person Sergei G    schedule 25.05.2016


Ответы (1)


Чтобы сделать это немного более общим, вы можете разложить массив символов C на *C.char, а затем использовать unsafe.Pointer, чтобы привести его обратно к массиву.

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

Или, может быть, немного проще

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