为了账号安全,请及时绑定邮箱和手机立即绑定

如何从 C 库中检索 probuf

如何从 C 库中检索 probuf

Go
精慕HU 2023-07-10 18:01:39
我正在尝试使用 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)),

    }


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信