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

最佳答案

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

  • pb_encode_nullterminated()pb_decode_nullterminated(),它们在编码后的数据后附加一个0x00字节,并在解码时对其进行检测。这是一种整洁的方法,但是在其他protobuf库中没有广泛的支持。因此,在将nanopb用于编码和解码时,它最有用。
  • pb_encode_delimited()pb_decode_delimited(),其大小在消息之前。其他几个protobuf库也支持此功能。不利之处在于,编码器必须先确定消息的长度,然后再对其进行编码,这目前对纳微级性能造成了很小的影响。

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

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

    10-13 08:06