从部分google protobuf消息中检索信息

Retrieve information from partial google protobuf message

本文关键字:检索 信息 消息 protobuf google      更新时间:2023-10-16

我正在做一个项目,涉及两个应用程序之间的通信在c++和python分别。它们将通过使用谷歌协议的TCP进行通信。现在,我的消息的设计如下:

raw_msg
{
    required int32 len = 1;
    required int32 name_len = 2;
    required string type_name = 3;
    required bytes data = 4;
}
[other msgs....]

所以有许多消息类型,它们在发送之前都将被打包到raw_msg中,在接收端,它将首先获得整个原始消息的len,并在没有足够的数据之前阻塞。一旦数据可以检索完整的消息,解码将开始。

我的问题是,由于raw_msg的长度也不固定,我怎么能得到len字段?例如,如果现在在我的缓冲区中只有lenname_len,我可以使用

吗?
raw_msg.ParseFromString(buffer)

raw_msg.len()得到len的值?

您需要单独对长度进行编码,而不是作为消息本身的一部分。通常不能保证仅仅因为len的字段编号为1,它就会在其他字段之前被编码——实际上,它出现在消息末尾或中间的任何地方都是合法的。

您可能想要做的是遵循半标准的"分隔"格式,在对消息本身进行编码之前,将消息的长度编码为"varint"。"varint"是一个以128为基数的变长整数,在protobuf文档中有描述。不幸的是,我不确定Python API是否有可公开访问的辅助方法来编码它(c++和Java有)。

另一个注意事项是,考虑使用oneof声明来区分不同的正文消息类型,而不是使用类型名称和字符串。oneof更类型安全,更容易理解,更有效地在线编码,并且避免了双重解析/编码的需要。