从 Any 包中提取和匹配 protobuf 消息类型名的首选方法
Preferred way of extracting and matching protobuf message typename from an Any package
我一直在使用 Any
为 protobuf 打包动态消息。
在接收端,我使用 Any.type_url()
来匹配包含的消息类型。
如果我错了,请纠正我,知道 .GetDescriptor()
不能与 Any
一起使用,我仍然想让匹配不那么混乱。我试图像这样用蛮力提取消息类型:
MyAny pouch;
// unpacking pouch
// Assume the message is "type.googleapis.com/MyTypeName"
....
const char* msgPrefix = "type.googleapis.com/";
auto lenPrefix = strlen(msgPrefix);
const std::string& msgURL = pouch.msg().type_url();
MamStr msgName = msgURL.substr(lenPrefix, msgURL.size());
if (msgName == "MyTypeName") {
// do stuff ...
}
但我仍然想知道是否有更简洁的方法来跳过前缀以获得类型 URL 的 "basename"。
谢谢!
你可以试试
std::string getBaseName(std::string const & url) {
return url.substr(url.find_last_of("/\") + 1);
}
如果它适合你。
虽然有一些情况,但不一定能正确爆破。
假设您有两个参数作为基本名称:http://url.com/example/2
这将获取最新的,即 2...
如果您不寻求跨平台支持,您可以随时寻求 https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/splitpath-wsplitpath?view=vs-2019
我一直在使用 Any
为 protobuf 打包动态消息。
在接收端,我使用 Any.type_url()
来匹配包含的消息类型。
如果我错了,请纠正我,知道 .GetDescriptor()
不能与 Any
一起使用,我仍然想让匹配不那么混乱。我试图像这样用蛮力提取消息类型:
MyAny pouch;
// unpacking pouch
// Assume the message is "type.googleapis.com/MyTypeName"
....
const char* msgPrefix = "type.googleapis.com/";
auto lenPrefix = strlen(msgPrefix);
const std::string& msgURL = pouch.msg().type_url();
MamStr msgName = msgURL.substr(lenPrefix, msgURL.size());
if (msgName == "MyTypeName") {
// do stuff ...
}
但我仍然想知道是否有更简洁的方法来跳过前缀以获得类型 URL 的 "basename"。
谢谢!
你可以试试
std::string getBaseName(std::string const & url) {
return url.substr(url.find_last_of("/\") + 1);
}
如果它适合你。
虽然有一些情况,但不一定能正确爆破。
假设您有两个参数作为基本名称:http://url.com/example/2
这将获取最新的,即 2...
如果您不寻求跨平台支持,您可以随时寻求 https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/splitpath-wsplitpath?view=vs-2019