是否可以将包含Protocol Buffers描述符的字符串反编译回.proto文件?
说我有一个很长的字符串,如
\n\file.proto\u001a\u000ccommon.proto\"\u00a3\u0001\n\nMsg1Request\u0012\u0017\n\u0006common\u0018\u0001 ...
等。
我需要恢复.proto,完全没有必要但是可以编译。
答案 0 :(得分:3)
是的,应该可以获得一些接近原始定义的东西。我不知道有任何现有的代码(希望其他人会这样做)。
Hava看看协议缓冲区本身如何处理String。
基本上
将字符串转换为字节(在java中使用charset =“ISO-8859-1”),然后它将是协议缓冲区消息(格式= FileDescriptorProto < / strong>在java中)。 FileDescriptorProto 是作为Protocol-Buffers安装的一部分构建的。
提取协议 - 缓冲消息
答案 1 :(得分:3)
在C ++中,FileDescriptor
接口有一个方法DebugString()
,它以.proto
语法格式化描述符内容 - 即正是您想要的。要使用它,首先需要使用FileDescriptorProto
接口编写代码以将原始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
。