java - 谷歌 Protocol Buffer - 用 C++ 编码,用 Java 解码 - InvalidProtocolBufferException

标签 java c++ protocol-buffers

对不起,我想我要疯了。我在 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;

产生这个输出

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).

二进制数据是一样的。我检查了我使用的原始文件版本是否正确。我有点不知所措。任何帮助表示赞赏。

最佳答案

您要求从 bufferwhole 中解析消息 - 我的猜测是 buffer 超过 88 个字节长。

我不记得 parseFrom 是否允许您指定要读取的最大数据量,但另一种方法是:

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

请注意,这仍然存在问题,您假设您可以在对 read 的一次调用中从流中读取所有数据,这从来都不是一件好事想法 - 但这是一个非常不同的问题。如果你打算在写入后关闭套接字,你当然可以在 Java 代码中从套接字的 InputStream 解析流。如果您要关闭流,我建议先将消息长度写入套接字(作为 32 位整数),这样您就可以在 Java 中读取它,并准确读取适量的数据,知道什么时候完成。

关于java - 谷歌 Protocol Buffer - 用 C++ 编码,用 Java 解码 - InvalidProtocolBufferException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7045384/

相关文章:

java - 提取 GWT 服务的结果

java - 更快地获取大目录内容(java.io.File 替代品)

java - Accumulo - 获取正确排序的扫描仪结果

用于方法组和装饰器的 C++ SFINAE

c# - 如何将 protobuf-net 与通过 ASP.NET Web 引用生成的类一起使用,同时避免代码重复?

javascript - 协议(protocol) JSON (PSON) 与 Protocol Buffer

java - 我正在 selenium 自动化中创建页面对象模型框架,并且面临 java 空指针异常

java - Eclipse IDE 构建目标问题

c++ - 如何在cout语句中显示相对文件路径

c++ - qt - 绘画事件之外的 setText 不好吗?