用C ++编写协议缓冲区数据,用AMQP / JMS读取Java

时间:2014-11-12 04:47:06

标签: jms buffer protocols protocol-buffers qpid

所以我对此感到有点难过。我在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工作,所以这里发生了什么?

2 个答案:

答案 0 :(得分:0)

这是一个完全猜测,但也许只有该字节数组的一部分是真实的消息,也许零是它的结束。初始分配大于实际消息,您需要跟踪写入的字节数,然后只读取另一侧的许多字节。

答案 1 :(得分:0)

我不知道如何解决问题,我也有类似的问题。但是,我可以帮助一下。跟踪的差异是由于将字节解释为有符号或无符号。两者的位模式相同。 130 = 10000010(unsigned char), - - 126 = 10000010(signed char)