2
Вот простой пример:Интеграция существующего кода C в Go. Преобразование без знака результата символ poiner в [] байт
package main
//#include <stdio.h>
//#include <strings.h>
//#include <stdlib.h>
/*
typedef struct {
unsigned char *data;
unsigned int data_len;
} Result;
Result *foo() {
Result *r = malloc(sizeof(Result));
r->data = (unsigned char *)malloc(10);
r->data_len = 10;
memset(r->data, 0, 10);
r->data = (unsigned char *)strdup("xxx123");
r->data_len = 6;
return r;
}
*/
import "C"
import (
"fmt"
// "unsafe"
)
func main() {
result := C.foo()
fmt.Printf("%v, %v, %v\n", result.data, string(*(result.data)), result.data_len)
}
В результате у меня есть что-то вроде этого
0x203970, x, 6
указатель data
, первый символ data
и размер. Но как я могу получить фактическое значение data
, желательно в качестве [] байтового типа, чтобы использовать его в коде go?
Иными словами - как конвертировать unsigned char *
в []byte
?
будет не то, что 'unsafe.Sizeof' вызов просто возвращает размер указателя, а чем длина массива, на который он указывает? –
Ещё один вопрос. В реальных данных porgram * данные представляют собой двоичные данные, а не строку. Является ли это подходящим приложением для char * и конвертировать с помощью GoString? – tacobot
@JamesHenstridge, да, ты прав. Я предполагаю, что это просто волшебное дело для меня в этом примере. Я удалю его из ответа. – Kavu