从部分google protobuf消息中检索信息
Retrieve information from partial google protobuf message
我正在做一个项目,涉及两个应用程序之间的通信在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
字段?例如,如果现在在我的缓冲区中只有len
和name_len
,我可以使用
raw_msg.ParseFromString(buffer)
和raw_msg.len()
得到len
的值?
您需要单独对长度进行编码,而不是作为消息本身的一部分。通常不能保证仅仅因为len
的字段编号为1,它就会在其他字段之前被编码——实际上,它出现在消息末尾或中间的任何地方都是合法的。
您可能想要做的是遵循半标准的"分隔"格式,在对消息本身进行编码之前,将消息的长度编码为"varint"。"varint"是一个以128为基数的变长整数,在protobuf文档中有描述。不幸的是,我不确定Python API是否有可公开访问的辅助方法来编码它(c++和Java有)。
另一个注意事项是,考虑使用oneof
声明来区分不同的正文消息类型,而不是使用类型名称和字符串。oneof
更类型安全,更容易理解,更有效地在线编码,并且避免了双重解析/编码的需要。
相关文章:
- 如何在 Linux 中务实地检索连接的接入点信息
- Qt 错误:QSqlQuery::value:尝试从表中检索统计信息时未定位在有效记录上 (QComboBox)
- 使用 GetNetworkParams() 检索网络信息时出错
- 32位到64位:LNK2019错误,如何检索相关信息
- C MACOS-编程检索代码符号证书信息
- 从类模块检索信息以在 switch 语句中输出时出现问题
- 使用友元函数从多态类中检索类型信息
- 如何在C++中以编程方式检索 64 位进程的详细信息
- 从网页中检索特定信息
- 正在检索有关当前登录会话的信息(Visual C++,Win 7)
- 如何检索连接到服务器的硬盘信息?示例 C/C 代码
- 正在检索系统和操作系统信息
- 从 CPtrArray MFC 输入和检索信息
- 检索数据结构对齐信息
- 从继承的对象检索信息
- 如何从该数组中检索信息
- 从部分google protobuf消息中检索信息
- c++如何从具有多个参数的节点中检索信息
- 更改时区的FILETIME信息检索
- Qt 5.5和OpenGL:检索设备信息