[英]google protocol buffers - encode in C++, decode in Java - InvalidProtocolBufferException
對不起,但我想我要瘋了。 我在 C++ 中有這個:
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;
這產生了這個 output
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 文件。 我有點不知所措。 任何幫助表示贊賞。
您要求從整個buffer
中解析消息 - 我的猜測是buffer
的長度超過 88 個字節。
我不記得parseFrom
是否允許您指定要讀取的最大數據量,但另一種選擇是:
ByteArrayIntputStream stream = new ByteArrayInputStream(buffer, 0, lenbytes);
EnvInfoProto envInfoProto = EnvInfoProto.parseFrom(stream);
請注意,這仍然存在問題,您假設您可以在一次調用中讀取 stream 中的所有數據read
,這絕不是一個好主意 - 但這是一個非常獨立的問題。 如果您要在寫入后關閉套接字,您當然可以從 Java 代碼中的套接字InputStream
中解析 stream。 如果您不打算關閉 stream,我建議先將消息長度寫入套接字(作為 32 位整數),然后您可以在 Java 中讀取它,並准確讀取正確數量的數據,知道什么時候你完了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.