这取决于你如何定义原文件中的重复场。据nanopb docs,则要么只是指定repeated
字段等你没有,然后使用一个回调函数来编码/解码过程中单独处理每个项目,或使用特定nanopb-设置,以便具有固定长度数组:
- 默认情况下,任何类型的字符串,字节和重复字段都映射到回调函数。
- 如果在
.proto
文件中指定一个特殊的选项(nanopb).max_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;