gpt4 book ai didi

c++ - 我需要用 Protobuf 存储长度信息吗?

转载 作者:行者123 更新时间:2023-12-02 10:10:23 24 4
gpt4 key购买 nike

我将 Protobufs 存储在一些非 volatile 内存中以保存配置信息。我正在使用 NanoPB 对它们进行解码/编码。由于我不知道编码后的 Protobuf 有多大,所以当我从内存中获取序列化的 proto 并进行解码时,我只获取编码后的 protobuf 可能的最大字节数,即使它占用的字节数更少。
我的问题是:我是否必须存储一些数据来描述 protobuf 的字节数以便我可以正确解码?
或者,如果我对序列化缓冲区进行 0 填充或使用其他方法,是否有办法让我自己确定。就目前而言,NanoPB 无法解码我给它的字节,很可能是因为在编码的原型(prototype)结束后有一些垃圾数据,我无法确定序列化数据的长度。

最佳答案

是的,必须以某种方式指示 protobuf 消息的结尾,因为格式不是自定界的。
Nanopb 为此提供了两种内置方法:

  • pb_encode_nullterminated()pb_decode_nullterminated() , 附加一个 0x00字节到编码数据并在解码时检测它。这是一种巧妙的方法,但在其他 protobuf 库中没有广泛的支持。因此,当 nanopb 用于编码和解码时,它最有用。
  • pb_encode_delimited()pb_decode_delimited() ,它在消息之前添加大小。其他几个 protobuf 库也支持这一点。一个缺点是编码器在编码之前必须首先确定消息的长度,这目前在 nanopb 中会产生很小的性能损失。

  • 还可以使用自定义方法,例如将消息长度存储在单独的内存位置。

    关于c++ - 我需要用 Protobuf 存储长度信息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63839878/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com