2013-10-17 113 views
1

是否可以將包含Protocol Buffers描述符的字符串反編譯回.proto文件?從描述符字符串恢復.proto文件。可能?

說我有一個很長的字符串像

\ n \ file.proto \ u001a \ u000ccommon.proto \「\ u00a3 \ U0001 \ n \ nMsg1Request \ u0012 \ u0017 \ n \ u0006common \ u0018 \ U0001。 ..等

我需要恢復.proto,不完全是必要的,因爲它是,但編譯。

感謝您的幫助

回答

2

是的,它應該可以得到一些東西接近獲得原始定義我不知道有任何現有的代碼可以做到這一點(希望其他人可以)。

Hava瞭解協議緩衝區如何處理字符串。

基本上

  1. 字符串轉換爲字節(字符集採用= 「ISO-8859-1」 在Java),它將隨後是一個協議緩衝區消息(格式= FileDescriptorProto在JAVA)。 FileDescriptorProto是作爲Protocol-Buffers安裝的一部分而構建的。

  2. 協議緩衝區消息

這裏提取的數據是顯示在Protocol-Buffer editor

enter image description here

+0

我一定會嘗試一下。如果我找到一個工具,我會報告。如果不是,我/我會自己做,但不會很快... – OGP

3

在C++中一個文件描述符協議中,FileDescriptor接口具有一種方法DebugString()其格式描述符的內容在.proto語法 - 即完全wha你想要。爲了使用它,首先需要編寫代碼,使用DescriptorPool接口將原始FileDescriptorProto轉換爲FileDescriptor

像這樣的東西應該這樣做:

#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

+0

它只打印第一條消息。我做錯了什麼或需要修改以打印多條消息? – Poma

+0

打印FileDescriptorProto中的所有內容。 –

+0

這是一個黑客攻擊。似乎DebugString()只能用proto2語法打印描述符。所以如果你不得不使用proto3語法,那將會有些麻煩。 :( – Wizmann