在带有 nanopb 的消息中使用重复字段规则
using repeated field rule in a message with nanopb in c
我很难理解如何使用重复字段规则。
例如,这是我的 .proto:
message Test
{
repeated float value = 1;
}
现在,我正在初始化一个新的测试对象:
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
字段,然后在 encoding/decoding 期间使用回调函数分别处理每个项目,要么使用特定于 nanopb 的设置,因此一个固定长度的数组:
- Strings, bytes and repeated fields of any type map to callback functions by default.
- If there is a special option
(nanopb).max_size
specified in the .proto
file, string maps to null-terminated char array and bytes map to a structure containing a char array and a size field.
- If
(nanopb).fixed_length
is set to true
and (nanopb).max_size
is also set, then bytes map to an inline byte array of fixed size.
- If there is a special option
(nanopb).max_count
specified on a repeated field, it maps to an array of whatever type is being repeated. Another field will be created for the actual number of entries stored.
比如字节数组需要使用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;
我很难理解如何使用重复字段规则。 例如,这是我的 .proto:
message Test
{
repeated float value = 1;
}
现在,我正在初始化一个新的测试对象:
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
字段,然后在 encoding/decoding 期间使用回调函数分别处理每个项目,要么使用特定于 nanopb 的设置,因此一个固定长度的数组:
- Strings, bytes and repeated fields of any type map to callback functions by default.
- If there is a special option
(nanopb).max_size
specified in the.proto
file, string maps to null-terminated char array and bytes map to a structure containing a char array and a size field.- If
(nanopb).fixed_length
is set totrue
and(nanopb).max_size
is also set, then bytes map to an inline byte array of fixed size.- If there is a special option
(nanopb).max_count
specified on a repeated field, it maps to an array of whatever type is being repeated. Another field will be created for the actual number of entries stored.
比如字节数组需要使用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;