在c中使用nanopb的消息中使用重复的字段规则

时间:2017-08-23 15:44:04

标签: c protocol-buffers nanopb

我很难实现如何使用重复的字段规则。 例如,这是我的.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.

然后,我怎么读回来?

1 个答案:

答案 0 :(得分:3)

这取决于您如何定义proto文件中的重复字段。根据{{​​3}},您只需像您一样指定repeated字段,然后在编码/解码期间使用回调函数分别处理每个项目,或者使用特定于nanopb的设置,以便修复长度数组:

  
      
  1. 默认情况下,任何类型的字符串,字节和重复字段都映射到回调函数。
  2.   
  3. 如果(nanopb).max_size文件中指定了特殊选项.proto,则字符串映射到以null结尾的char数组,字节映射到包含char数组和size字段的结构。
  4.   
  5. 如果(nanopb).fixed_length设置为true(nanopb).max_size也已设置,则字节映射到固定大小的内联字节数组。
  6.   
  7. 如果在重复字段上指定了特殊选项(nanopb).max_count,它将映射到正在重复的任何类型的数组。将为存储的实际条目数创建另一个字段。
  8.   

例如,字节数组需要使用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;