所以我对此感到有点难过。我在C ++端有一个AMQP类实现,最终将我的Porotocol缓冲区对象序列化为字符串:
qpid::messaging::message qmesg;
std::string msgstr;
ProtoMessage.SerializeToString(&msgstr);
qmesg.setContent(msgstr);
//Proceed to send the message
邮件正文设置为this,内容类型为二进制。
在Java方面,我们从JMSBytesMessage对象中读取字节,然后尝试将数据解析回协议缓冲区对象:
JMSBytesMessage msg; //Assume this is in the proper context
ProtoMessage.parseFrom(msg.getData().array());
我也试过了:
byte[] bytearr = new byte[]
msg.readBytes(bytearr);
其中也是如此。
当我记录字节数据时,我确实看到了字节值(使用Array.ToString(byte []),但是java端的上面代码抛出了InvalidProtocolBufferException:
com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).
我假设因为它是字节数据,所以它是字符编码的匿名。我错过了一些明显的东西吗此外,请不要使用其他实施建议,无论这看起来多么尴尬,只需假设必须使用此建议。任何指导都将不胜感激。
协议缓冲区字节数组值(可能不必要?为什么不呢)编辑:差分字节结果,很有趣。
编辑:用Java解码顶部,用C ++编写底部:
10 0 18 0 34 0 42 0 50 0 58 0 82 0 90 0 98 0 106 0 114 0 122 0 -126 1 6 97 99 99 101 112
10 0 18 0 34 0 42 0 50 0 58 0 82 0 90 0 98 0 106 0 114 0 122 0 130 1 6 97 99 99 101 112
这些只是前几个,但模式仍在继续。大多数数据都是相同的,但有些字节更改为无符号签名。我没有太多的Java工作,所以这里发生了什么?
答案 0 :(得分:0)
这是一个完全猜测,但也许只有该字节数组的一部分是真实的消息,也许零是它的结束。初始分配大于实际消息,您需要跟踪写入的字节数,然后只读取另一侧的许多字节。
答案 1 :(得分:0)
我不知道如何解决问题,我也有类似的问题。但是,我可以帮助一下。跟踪的差异是由于将字节解释为有符号或无符号。两者的位模式相同。 130 = 10000010(unsigned char), - - 126 = 10000010(signed char)