我正在尝试将一些数据从C程序发送到Golang。数据由原始C结构表示。我正试图在Golang中解组它。
这样的样本:
typedef struct tagA {
int64_t a;
int64_t b;
char c[1024];
}A;
方法是将此C结构重写为Golang结构。说:
type A struct{
a int64
b int64
c [1024]byte
}
然后使用encoding/binary
将原始数据字节流转换为它。但是使用这种方法,我应该保持两种不同的相互关联的结构。
另一种方法是使用Cgo
,只需导入包含此结构的C语言头文件(.h
),并使用C.A
和不安全点将原始数据转换为struct C.A.但它有点儿错误,我崩溃将C char数组转换为Golang字符串。
你有什么选择?有什么建议吗?
答案 0 :(得分:2)
使用cgo的一种方式:您可以使用var s *C.struct_tagA = &C.N
或仅使用s := &C.N
这样的工作示例代码来访问C结构的任何字段:
package main
/*
#include <string.h>
#include <stdint.h>
typedef struct tagA {
int64_t a;
int64_t b;
char c[1024];
}A;
A N={12,22,"test"};
*/
import "C"
import "fmt"
type A struct {
a int64
b int64
c [1024]byte
}
func main() {
s := &C.N // var s *C.struct_tagA = &C.N
t := A{a: int64(s.a), b: int64(s.b)}
length := 0
for i, v := range s.c {
t.c[i] = byte(v)
if v == 0 {
length = i
break
}
}
fmt.Println("len(s.c):", len(s.c)) // 1024
str := string(t.c[0:length])
fmt.Printf("len:%d %q \n", len(str), str) // len:4 "test"
s.a *= 10
fmt.Println(s.a) // 120
}
输出:
len(s.c): 1024
len:4 "test"
120
您可以直接在Golang中使用s.a
,s.b
和s.c
。你不需要复制所有内容。
答案 1 :(得分:0)
你可以通过C.struct_YourStruct