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

Posted

技术标签:

【中文标题】我需要用 Protobuf 存储长度信息吗?【英文标题】:Do I Need To Store Length Info With Protobuf? 【发布时间】:2020-09-11 02:09:35 【问题描述】:

我将 Protobufs 存储在一些非易失性内存中以保存配置信息。我正在使用 NanoPB 对它们进行解码/编码。由于我不知道编码后的 Protobuf 有多大,所以当我从内存中获取序列化的 proto 并进行解码时,我只获取编码后的 protobuf 可能的最大字节数,即使它占用的字节数更少。

我的问题是:我是否必须存储一些描述 protobuf 字节数的数据,以便我可以正确解码?

或者,如果我对序列化缓冲区进行 0 填充或使用其他方法,是否有办法让我自己确定。就目前而言,NanoPB 无法解码我给它的字节,很可能是因为在编码的 proto 结束后有一些垃圾数据,我无法确定序列化数据的长度。

【问题讨论】:

【参考方案1】:

是的,必须以某种方式指示 protobuf 消息的结尾,因为格式不是自定界的。

Nanopb 为此提供了两种内置方法:

    pb_encode_nullterminated()pb_decode_nullterminated(),它们在编码数据后附加一个0x00 字节,并在解码时检测它。这是一种巧妙的方法,但在其他 protobuf 库中没有广泛的支持。因此,当 nanopb 用于编码和解码时,它最有用。

    pb_encode_delimited()pb_decode_delimited(),在消息之前添加大小。其他几个 protobuf 库也支持这一点。一个缺点是编码器在编码之前必须首先确定消息的长度,这目前在 nanopb 中会造成很小的性能损失。

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

【讨论】:

以上是关于我需要用 Protobuf 存储长度信息吗?的主要内容,如果未能解决你的问题,请参考以下文章

用 protobuf 替换 binaryformatter

华为mate10pro可以加存储卡吗

基于Go语言的protobuf 安装 以及简单测试用例

php protobuf不能为null吗

protobuf编译安装

protobuf 可以部分读取吗?