【问题标题】:Encode/decode strings inside byte type in nanopb with C使用 C 在 nanopb 中对字节类型内的字符串进行编码/解码
【发布时间】:2021-12-31 23:50:28
【问题描述】:

我有一个如下所示的.proto 文件:

message ObjValue
{
// ...
    optional bytes byteval    = 6 [max_size = 256]; // arbitrary structure or message
// ...

我使用这个 proto 编码来发送改变的结构。这个结构基本上包含整数和字符串(一个以 null 结尾的 char 数组)。

发送者发送结构体做这样的事情:

   // Here I create the struct and fill it with integers and strings
   struct flow_msg *flow_msg = malloc(sizeof(struct flow_msg));
    flow_msg->dst_addr        = 1;
    flow_msg->src_addr        = 2;
    flow_msg->src_ap_name     = strdup(src_ap_name);

    // Here I save the length of the struct and a void pointer that points to the struct
    struct ser_obj_value *obj_value = malloc(sizeof(struct ser_obj_value));
    obj_value->size = sizeof(struct flow_msg) + strlen(src_ap_name) + 1; // +1 because of '\0'
    obj_value->data = flow_msg;

然后,接收方获取消息,使用 nanopb 对其进行解码,然后:

int
handle_msg(void *f_msg)
{
    struct flow_msg *flow_msg = (struct flow_msg *)f_msg;
}

此时,如果我尝试读取整数的值,则没有问题(例如flow_msg->dst_addr),但如果我想读取字符串值,我会得到一个空指针,因为flow_msg->src_ap_name 是空。

我不知道应该如何正确编码/解码字符串值...真的不知道我在这里缺少什么...任何线索?

【问题讨论】:

  • 你的代码很难理解,但我认为主要是你的结构(以及 protobuf 消息)实际上并不包含字符串,只是一个指向它的指针。一旦你在另一边反序列化它,指针只是指向内存中的一个随机位置。
  • 对不起,我其实只是写了相关的代码块,以便更容易理解。 nanopb 编码部分不存在,因为经过了很好的测试,我很确定它运行良好。但是,如果问题出在编码器方面,我写的代码是不是做错了什么?
  • src_ap_name字段的类型是char *还是类似的?在这种情况下,您只是发送一个内存地址。而且由于其他应用程序不共享相同的内存,因此该内存地址将毫无用处。有点与this question 相关
  • 是的,是char * 类型。谢谢指出,你说的有道理。但是通过 strdup() 我已经在内存中 malloc-ing 字符串,所以我应该已经将字符串保存在内存中。
  • 当然,它在发送机器的内存中。但它完全在内存中的其他地方,而不是结构,并且结构是您发送的唯一内容。

标签: c string void-pointers nanopb


【解决方案1】:

首先,我现在意识到我的问题是多么愚蠢。实际上,我不会删除它,因为@jpa 花了一些时间试图回答我的疑问。

主要问题是我试图发送指针(即内存地址),然后接收方当然不知道如何处理这个随机内存地址。另外,问题是我“不走运”,这可能是因为我在接收端使用相同的机器和相同的编译器,一些指针实际上被正确取消引用,这让我很困惑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 2019-08-18
    • 1970-01-01
    • 2013-06-04
    • 2020-03-22
    • 2012-03-25
    • 2014-12-31
    • 1970-01-01
    相关资源
    最近更新 更多