是否可以将包含协议缓冲区描述符的字符串反编译回 .proto 文件?
说我有一个长字符串
\n\file.proto\u001a\u000ccommon.proto\"\u00a3\u0001\n\nMsg1Request\u0012\u0017\n\u0006common\u0018\u0001 ...
等等
我需要恢复 .proto,不需要完全按照原样进行,但可以编译。
是否可以将包含协议缓冲区描述符的字符串反编译回 .proto 文件?
说我有一个长字符串
\n\file.proto\u001a\u000ccommon.proto\"\u00a3\u0001\n\nMsg1Request\u0012\u0017\n\u0006common\u0018\u0001 ...
等等
我需要恢复 .proto,不需要完全按照原样进行,但可以编译。
在 C++ 中,该FileDescriptor
接口有一个方法DebugString()
可以格式化描述符内容的.proto
语法——即,正是您想要的。为了使用它,您首先需要使用接口编写代码将 raw 转换FileDescriptorProto
为 a 。FileDescriptor
DescriptorPool
这样的事情应该这样做:
#include <google/protobuf/descriptor.h>
#include <google/protobuf/descriptor.pb.h>
#include <iostream>
int main() {
google::protobuf::FileDescriptorProto fileProto;
fileProto.ParseFromFileDescriptor(0);
google::protobuf::DescriptorPool pool;
const google::protobuf::FileDescriptor* desc =
pool.BuildFile(fileProto);
std::cout << desc->DebugString() << std::endl;
return 0;
}
您需要向该程序提供 FileDescriptorProto 的原始字节,您可以通过使用 Java 使用 ISO-8859-1 字符集将字符串编码为字节来获取这些字节。
另请注意,如果文件导入任何其他文件,则上述内容不起作用 - 您必须将这些导入加载到第一个文件DescriptorPool
中。
是的,应该有可能得到一些接近原始定义的东西。我不知道任何现有的代码可以做到这一点(希望其他人会这样做)。
看看协议缓冲区本身如何处理字符串。
基本上
将字符串转换为字节(在 java 中使用 charset="ISO-8859-1"),然后它将是Protocol-Buffer 消息(在 java 中格式= FileDescriptorProto)。FileDescriptorProto是作为 Protocol-Buffers 安装的一部分构建的。
提取Protocol-Buffer 消息中的数据
这是协议缓冲区编辑器中显示的文件描述符协议