我正在尝试使用 Google Protocol Buffers 与 Go 中的 C 库进行通信,但无法使其工作。我在尝试将 protobuf 发送到 C 库时遇到错误我将发布最小代码来重现我现在面临的错误(我已删除了大部分 C 部分,因为它与此错误无关): /* #cgo CFLAGS: -I@CURRENT_SOURCE_DIR@/../../library/crnd/include - I@CMAKE_CURRENT_BINARY_DIR@/../../library #cgo LDFLAGS: -L@CRND_LIBRARY_PATH@ -lcrnd #include <api_c.h> #include <stdint.h> #include <stdio.h> #include <inttypes.h> typedef struct SerializedStruct { void* data; int64_t size; } Serialized; */ import "C" func (crnd wrapper) MyFunction() { // Create a protobuf sample_request := &messages.SampleRequest { ... add members ...} fmt.Printf(proto.MarshalTextString(sample_request)); // print the message to check it works data, err := proto.Marshal(sample_request) if err != nil { log.Fatal("marshaling error: ", err) } sample_request_serialized := C.Serialized { data: pointer.Save(data), size: C.int64_t(len(data)), } // Here I would send my protobuf to the C library, but it is not // working, so I'm trying to reconstruct the protobuf to check // if something is broken before getting to the C side // Let's reconstruct the protobuf back data_req := (*[1 << 30]byte)(sample_request_serialized.data)[:int(sample_request_serialized.size):int(sample_request_serialized.size)] sample_req := &messages.SampleRequest{} err := proto.Unmarshal(data_req, sample_req) if err != nil { log.Fatal("unmarshaling error: ", err) } }我收到以下错误:unmarshaling error: proto: crnd.SampleRequest: illegal tag 0 (wire type 0)
1 回答
收到一只叮咚
TA贡献1821条经验 获得超4个赞
我设法让它工作创建缓冲区的副本:
...
p := C.malloc(C.size_t(len(data)))
defer C.free(p)
cBuf := (*[1 << 30]byte)(p)
copy(cBuf[:], data)
sample_request_serialized := &C.Serialized {
data: p,
size: C.int64_t(len(data)),
}
- 1 回答
- 0 关注
- 139 浏览
添加回答
举报
0/150
提交
取消