簡體   English   中英

谷歌協議緩沖區 - 在 C++ 中編碼,在 Java 中解碼 - InvalidProtocolBufferException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM