【发布时间】: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