从描述符字符串恢复.proto文件。可能?

时间:2013-10-17 05:02:45

标签: protocol-buffers

是否可以将包含Protocol Buffers描述符的字符串反编译回.proto文件?

说我有一个很长的字符串,如

\n\file.proto\u001a\u000ccommon.proto\"\u00a3\u0001\n\nMsg1Request\u0012\u0017\n\u0006common\u0018\u0001 ...等。

我需要恢复.proto,完全没有必要但是可以编译。

2 个答案:

答案 0 :(得分:3)

是的,应该可以获得一些接近原始定义的东西。我不知道有任何现有的代码(希望其他人会这样做)。

Hava看看协议缓冲区本身如何处理String。

基本上

  1. 将字符串转换为字节(在java中使用charset =“ISO-8859-1”),然后它将是协议缓冲区消息(格式= FileDescriptorProto < / strong>在java中)。 FileDescriptorProto 是作为Protocol-Buffers安装的一部分构建的。

  2. 提取协议 - 缓冲消息

  3. 中的数据

    这是Protocol-Buffer editor

    中显示的文件描述符协议

    enter image description here

答案 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