2013-09-27 2 views
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?

ответ

1

Вы можете сделать это с unsafe.Pointer и C.GoStringN:

data := (*C.char)(unsafe.Pointer(result.data)) 
data_len := C.int(result.data_len) 

fmt.Println(C.GoStringN(data, data_len)) 

И самый простой способ:

data := (*C.char)(unsafe.Pointer(result.data)) 
fmt.Println(C.GoString(data)) 
+1

будет не то, что 'unsafe.Sizeof' вызов просто возвращает размер указателя, а чем длина массива, на который он указывает? –

+0

Ещё один вопрос. В реальных данных porgram * данные представляют собой двоичные данные, а не строку. Является ли это подходящим приложением для char * и конвертировать с помощью GoString? – tacobot

+0

@JamesHenstridge, да, ты прав. Я предполагаю, что это просто волшебное дело для меня в этом примере. Я удалю его из ответа. – Kavu