Restoring .proto file from descriptor string. Possible?

前端 未结 2 471
面向向阳花
面向向阳花 2021-01-03 10:06

Is it possible to decompile a string containing Protocol Buffers descriptor back to .proto file?

Say I have a long string like

\\n\\file.proto\\u001a\

相关标签:
2条回答
  • 2021-01-03 10:20

    Yes it should be possible to get some thing close get original definition. I do not know of any existing code to do it (hopefully some one else will).

    Hava a look at how protocol buffers itself handles the String.

    Basically

    1. convert the string to bytes (using charset="ISO-8859-1" in java), it will then be a Protocol-Buffer message(format=FileDescriptorProto in java). The FileDescriptorProto is built as part of the Protocol-Buffers install.

    2. Extract the data in the Protocol-Buffer message

    Here is a File-Descriptor protocol displayed in the Protocol-Buffer editor

    enter image description here

    0 讨论(0)
  • 2021-01-03 10:29

    In C++, the FileDescriptor interface has a method DebugString() which formats the descriptor contents in .proto syntax -- i.e. exactly what you want. In order to use it, you first need to write code to convert the raw FileDescriptorProto to a FileDescriptor, using the DescriptorPool interface.

    Something like this should do it:

    #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;
    }
    

    You need to feed this program the raw bytes of the FileDescriptorProto, which you can get by using Java to encode your string to bytes using the ISO-8859-1 charset.

    Also note that the above doesn't work if the file imports any other files -- you would have to load those imports into the DescriptorPool first.

    0 讨论(0)
提交回复
热议问题