【问题标题】:using repeated field rule in a message with nanopb in c在 c 中使用 nanopb 的消息中使用重复的字段规则
【发布时间】:2017-08-23 15:44:04
【问题描述】:

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

然后,我该如何读回它们?

【问题讨论】:

    标签: c protocol-buffers nanopb


    【解决方案1】:

    这取决于您如何定义 proto 文件中的重复字段。根据nanopb docs,您要么像以前那样指定repeated 字段,然后在编码/解码期间使用回调函数分别处理每个项目,要么使用特定于nanopb 的设置,因此有一个固定长度的数组:

    1. 默认情况下,任何类型的字符串、字节和重复字段都映射到回调函数。
    2. 如果在 .proto 文件中指定了特殊选项 (nanopb).max_size,则字符串映射到以空字符结尾的 char 数组,而字节映射到包含 char 数组和大小字段的结构。
    3. 如果(nanopb).fixed_length 设置为true 并且(nanopb).max_size 也设置了,则字节映射到固定大小的内联字节数组。
    4. 如果在重复字段上指定了特殊选项(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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 2012-12-06
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      相关资源
      最近更新 更多