我需要使用 Protobuf 存储长度信息吗?
Do I Need To Store Length Info With Protobuf?
我将 Protobuf 存储在一些非易失性内存中以保存配置信息。我正在使用 NanoPB decode/encode 它们。因为我不知道编码的 Protobuf 有多大,所以当我从内存中获取序列化 proto 并解码时,我只是获取了编码的 protobuf 可能的最大字节数,即使它占用的字节更少。
我的问题是:我是否必须存储一些描述 protobuf 有多少字节的数据才能正确解码?
或者有没有办法让我自己确定是对序列化缓冲区进行 0 填充还是使用其他方法。就目前而言,NanoPB 无法解码我给它的字节,很可能是因为编码原型结束后有一些垃圾数据,我无法判断序列化数据的长度。
是的,必须以某种方式指示 protobuf 消息的结尾,因为格式不是 self-delimiting。
Nanopb为此提供了两个built-in方法:
pb_encode_nullterminated()
和pb_decode_nullterminated()
,它们在编码数据后附加一个0x00
字节,并在解码时检测它。这是一种很好的方法,但在其他 protobuf 库中没有得到广泛支持。因此,当 nanopb 用于编码和解码时,它最有用。
pb_encode_delimited()
和 pb_decode_delimited()
,它们在消息前添加大小。这也得到了其他几个 protobuf 库的支持。缺点是编码器必须先确定消息的长度,然后再对其进行编码,目前这会导致 nanopb 的性能损失。
也可以使用自定义方法,例如将消息长度存储在单独的内存位置。
我将 Protobuf 存储在一些非易失性内存中以保存配置信息。我正在使用 NanoPB decode/encode 它们。因为我不知道编码的 Protobuf 有多大,所以当我从内存中获取序列化 proto 并解码时,我只是获取了编码的 protobuf 可能的最大字节数,即使它占用的字节更少。
我的问题是:我是否必须存储一些描述 protobuf 有多少字节的数据才能正确解码?
或者有没有办法让我自己确定是对序列化缓冲区进行 0 填充还是使用其他方法。就目前而言,NanoPB 无法解码我给它的字节,很可能是因为编码原型结束后有一些垃圾数据,我无法判断序列化数据的长度。
是的,必须以某种方式指示 protobuf 消息的结尾,因为格式不是 self-delimiting。
Nanopb为此提供了两个built-in方法:
pb_encode_nullterminated()
和pb_decode_nullterminated()
,它们在编码数据后附加一个0x00
字节,并在解码时检测它。这是一种很好的方法,但在其他 protobuf 库中没有得到广泛支持。因此,当 nanopb 用于编码和解码时,它最有用。pb_encode_delimited()
和pb_decode_delimited()
,它们在消息前添加大小。这也得到了其他几个 protobuf 库的支持。缺点是编码器必须先确定消息的长度,然后再对其进行编码,目前这会导致 nanopb 的性能损失。
也可以使用自定义方法,例如将消息长度存储在单独的内存位置。