0

所以我对此有点难过。我在 C++ 端有一个 AMQP 类实现,最终将我的 Porotocol 缓冲区对象序列化为字符串:

qpid::messaging::message qmesg;
std::string msgstr;
ProtoMessage.SerializeToString(&msgstr);
qmesg.setContent(msgstr);

//Proceed to send the message

消息体设置为此,内容类型为二进制。

在 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 工作,所以这里发生了什么?

4

2 回答 2

0

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

于 2014-11-12T11:15:34.333 回答
0

我不知道如何解决这个问题,我也有类似的问题。不过,我可以提供一点帮助。轨迹的差异是由于将字节解释为有符号或无符号。两者的位模式相同。130 = 10000010(无符号字符),-126 = 10000010(有符号字符)

于 2015-01-22T21:37:34.737 回答