me *_*uff 4 c protocol-buffers nanopb
I'm having a hard time in realizing how to use the repeated field rule. for example, this is my .proto:
message Test
{
repeated float value = 1;
}
Run Code Online (Sandbox Code Playgroud)
now, I'm initialize a new Test object:
Test test = test_init_zero()
Run Code Online (Sandbox Code Playgroud)
Finally, I want to assign some values. For example:
float values[] = { 1.0, 2.2, 5.5, 7.13 }
Run Code Online (Sandbox Code Playgroud)
My question is how can I assign them? is it like
test.value = values
//or
test.value[0] = values[0] //... etc.
Run Code Online (Sandbox Code Playgroud)
and then, how do I read them back?
这取决于您如何定义 proto 文件中的重复字段。根据nanopb docs,您要么repeated像您一样指定字段,然后在编码/解码期间使用回调函数分别处理每个项目,要么使用特定于 nanopb 的设置,因此具有固定长度的数组:
- 默认情况下,任何类型的字符串、字节和重复字段都映射到回调函数。
- 如果文件中
(nanopb).max_size指定了特殊选项.proto,则字符串映射到以空字符结尾的字符数组,字节映射到包含字符数组和大小字段的结构。- 如果
(nanopb).fixed_length设置为true并且(nanopb).max_size也设置了,则字节映射到固定大小的内联字节数组。- 如果
(nanopb).max_count在重复字段上指定了特殊选项,它将映射到任何类型的重复数组。将为存储的实际条目数创建另一个字段。
例如,字节数组需要使用max_size:
required bytes data = 1 [(nanopb).max_size = 40, (nanopb).fixed_length = true];
Run Code Online (Sandbox Code Playgroud)
当使用 nanopb 编译时,这将创建以下字段:
// byte arrays get a special treatment in nanopb
pb_byte_t data[40];
Run Code Online (Sandbox Code Playgroud)
或者,对于 a float,您将max_count根据规则 4 使用:
repeated float data = 1 [(nanopb).max_count = 40];
Run Code Online (Sandbox Code Playgroud)
然后你会得到:
size_t data_count;
float data[40];
Run Code Online (Sandbox Code Playgroud)
如果你repeated像你一样简单地定义一个字段,那么 nanopb 将创建一个回调函数:
// repeated float value = 1;
pb_callback_t value;
Run Code Online (Sandbox Code Playgroud)
这意味着您必须提供自己的函数来处理每个传入的项目:
yourobject.value.arg = &custom_args;
yourobject.value.funcs.decode = custom_function_for_decoding;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5155 次 |
| 最近记录: |