2011-08-12 15 views
3

對不起,但我認爲我很生氣。我有這個在C++:google協議緩衝區 - 在C++中加密,在Java中解密 - InvalidProtocolBufferException

std::stringstream message; 
protoMsg.SerializeToOstream(&message); 
boost::system::error_code ignored_error; 
std::cout << "Writing response to socket. Byte size " << protoMsg.ByteSize() << " Buffer " << message.str().length() << std::endl; 
for(int i(0);i<(int)message.str().length();i++) 
    std::cout << (int)message.str().at(i); 
std::cout << std::endl; 
boost::asio::write(socket, boost::asio::buffer(message.str()), ignored_error); 
std::cout << "Done writing." << std::endl; 

其中產量這個輸出

Writing response to socket. Byte size 88 Buffer 88 
1886811891161111001113278971091012500000000320400480560640730000000081000000008859621061211611110011132115121109789710910111416691201161011141109710832114101113117101115116 
Done writing. 

而這在Java中:

try { 
    System.out.println("Parsing"); 
    int lenbytes = is.read(buffer); 
    System.out.println("Read bytes " + lenbytes); 
    for(int i=0;i<lenbytes;i++) 
    System.out.print(Integer.toString((int)buffer[i])); 
    System.out.println(""); 
    EnvInfoProto envInfoProto = EnvInfoProto.parseFrom(buffer); 
    System.out.println("Done"); 
    return envInfoProto; 
} catch(IOException ignore) { System.out.println("Ex: " + ignore.toString(); } 

其中產量

Parsing 
Read bytes 88 
1886811891161111001113278971091012500000000320400480560640730000000081000000008859621061211611110011132115121109789710910111416691201161011141109710832114101113117101115116 
Ex: com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero). 

二進制數據是相同。我檢查了我正在使用正確版本的proto文件。我有點虧本tbh。任何幫助讚賞。

+1

有一點需要注意你的標題:使用協議緩衝區不會被視爲加密,不應該被誤認爲是加密的。 –

回答

3

您正在要求從整個buffer解析該消息 - 我的猜測是buffer長度超過88個字節。

我不記得隨便parseFrom是否允許您指定要讀取的數據的最大量,但更好的方法是:

ByteArrayIntputStream stream = new ByteArrayInputStream(buffer, 0, lenbytes); 
EnvInfoProto envInfoProto = EnvInfoProto.parseFrom(stream); 

注意,這仍然有你假設問題您可以在一次調用中讀取數據流中的所有數據至read,這絕不是一個好主意 - 但這是一個非常獨立的問題。如果你要在寫入之後關閉套接字,當然你可以在Java代碼中從套接字的InputStream解析流。如果你是而不是將關閉流,我會建議首先將消息長度寫入套接字(作爲32位整數),然後你可以用Java讀取它,並且讀取恰到好處的數據量,知道你什麼時候完成。

+0

乾杯謝謝.... – Cookie