2011-08-12 25 views
3

申し訳ありませんが、私は怒っていると思います。私はC++でこれを持っている:Googleプロトコルバッファ - C++で暗号化、Javaで復号化 - InvalidProtocolBufferException

この出力Javaで

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

そして、これを生み出す

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; 

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

バイナリデータがあるが得

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(); } 

同じ。私はprotoファイルの正しいバージョンを使用していることを確認しました。私は損失のビットで少しです。どんな助けもありがたい。

+1

あなたのタイトルの周りに1つの注意点があります:プロトコルバッファを使用することは暗号化としてカウントされません。間違えてはいけません。 –

答えて

3

のメッセージ全体をbufferから解析するように要求しています。私の推測によれば、bufferは88バイト以上です。

私はparseFromはあなたが読むためにデータの最大量を指定することができますが、代替が可能かどうかぶっきらぼう覚えていないことができます。これはまだあなたがと仮定している問題を持っていることを

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

注意をreadへの一回の呼び出しでストリームからすべてのデータを読み取ることはできませんが、これは決して良い考えではありませんが、それは非常に別の問題です。もしあなたが書いた後にソケットを閉じるつもりならば、ソケットのInputStreamからストリームを解析することができます。 でない場合は、ストリームを閉じるために、メッセージの長さを最初にソケットに書き込むことをお勧めします(32ビット整数として)ので、それをJavaで読み取って、正確な量のデータを読み込むことができます。あなたが終わった時を知っている。

+0

感謝しています.... – Cookie