谷歌协议缓冲区-编码在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;
产生以下输出
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).
二进制数据是相同的。我检查了我使用的是正确版本的原型文件。我有点不知所措。
您要求从buffer
的整个解析消息-我的猜测是buffer
超过88字节长。
我不能立即记住parseFrom
是否允许您指定要读取的最大数据量,但另一种选择是:
ByteArrayIntputStream stream = new ByteArrayInputStream(buffer, 0, lenbytes);
EnvInfoProto envInfoProto = EnvInfoProto.parseFrom(stream);
请注意,这仍然有一个问题,即您假设可以在对read
的单个调用中读取流中的所有数据,这从来都不是一个好主意-但这是一个非常独立的问题。如果要在写入后关闭套接字,当然可以在Java代码中从套接字的InputStream
解析流。如果您不要关闭流,我建议首先将消息长度写入套接字(作为32位整数),以便您可以在Java中读取它,并读取正确的数据量,知道何时完成。
相关文章:
- 在java中解决这段代码时面临循环中的问题
- 无法解码base64+deflate数据
- 尝试用java代码编译和运行c++代码
- 在这种情况下,java对象是否可以调用本机函数
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 在java中读取c++字节的位字段
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 使用已使用 java 编码的 openssl 解码数据
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- Android Java USB for native cpp
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- C++ equivalent to Java Map getOrDefault?
- C++ 中的 Java 样式枚举
- 用Qt解码用Java ImageIO类编码的图像
- Java:编写自定义视频编解码器的指南
- 谷歌协议缓冲区-编码在c++,解码在Java - InvalidProtocolBufferException
- 在Android上用Java或C/C++解码Airplay数据包
- 我如何在java中使用条件运算符编写解码函数