[英]creating callbacks and structs for repeated field in a protobuf message in nanopb in c
[英]using repeated field rule in a message with nanopb in c
我在实现如何使用重复字段规则方面遇到了困难。 例如,这是我的.proto:
message Test
{
repeated float value = 1;
}
现在,我初始化一个新的Test对象:
Test test = test_init_zero()
最后,我想分配一些值。 例如:
float values[] = { 1.0, 2.2, 5.5, 7.13 }
我的问题是如何分配他们? 像吗
test.value = values
//or
test.value[0] = values[0] //... etc.
然后,我该如何读回它们?
这取决于您如何定义原型文件中的重复字段。 根据nanopb docs ,您可以像执行操作一样指定repeated
字段,然后在编码/解码期间使用回调函数分别处理每个项目,或者使用nanopb特定的设置,因此具有固定长度的数组:
- 默认情况下,任何类型的字符串,字节和重复字段都映射到回调函数。
- 如果在
.proto
文件中指定了特殊选项(nanopb).max_size
,则字符串映射到以空值结尾的char数组,字节映射到包含char数组和size字段的结构。- 如果将
(nanopb).fixed_length
设置为true
并且还设置了(nanopb).max_size
,则字节将映射到固定大小的嵌入式字节数组。- 如果在重复字段上指定了特殊选项
(nanopb).max_count
,则它将映射到要重复的任何类型的数组。 将为存储的实际条目数创建另一个字段。
例如,字节数组需要使用max_size
:
required bytes data = 1 [(nanopb).max_size = 40, (nanopb).fixed_length = true];
使用nanopb进行编译时,这将创建以下字段:
// byte arrays get a special treatment in nanopb
pb_byte_t data[40];
或者,对于float
,您可以根据规则4使用max_count
:
repeated float data = 1 [(nanopb).max_count = 40];
然后您将获得:
size_t data_count;
float data[40];
如果像您一样简单地定义repeated
字段,那么nanopb将创建一个回调函数:
// repeated float value = 1;
pb_callback_t value;
这意味着您将必须提供自己的函数来处理每个传入的项目:
yourobject.value.arg = &custom_args;
yourobject.value.funcs.decode = custom_function_for_decoding;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.