3

是否可以将包含协议缓冲区描述符的字符串反编译回 .proto 文件?

说我有一个长字符串

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

我需要恢复 .proto,不需要完全按照原样进行,但可以编译。

4

2 回答 2

5

在 C++ 中,该FileDescriptor接口有一个方法DebugString()可以格式化描述符内容的.proto语法——即,正是您想要的。为了使用它,您首先需要使用接口编写代码将 raw 转换FileDescriptorProto为 a 。FileDescriptorDescriptorPool

这样的事情应该这样做:

#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中。

于 2013-10-17T22:37:33.123 回答
4

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

看看协议缓冲区本身如何处理字符串。

基本上

  1. 将字符串转换为字节(在 java 中使用 charset="ISO-8859-1"),然后它将是Protocol-Buffer 消息(在 java 中格式= FileDescriptorProto)。FileDescriptorProto是作为 Protocol-Buffers 安装的一部分构建的。

  2. 提取Protocol-Buffer 消息中的数据

这是协议缓冲区编辑器中显示的文件描述符协议

在此处输入图像描述

于 2013-10-17T07:52:13.093 回答