0

だから私はこれに少し困惑しています。最終的に Porotocol バッファ オブジェクトを文字列にシリアル化する C++ 側の AMQP クラスの実装があります。

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

これは完全な推測ですが、おそらくそのバイト配列の一部だけが実際のメッセージであり、おそらくその 0 がメッセージの終わりです。最初の割り当ては実際のメッセージよりも大きく、書き込まれたバイト数を追跡​​する必要があり、反対側でそのバイト数だけを読み取る必要があります。

于 2014-11-12T11:15:34.333 に答える
0

問題を解決する方法がわかりません。同様の問題があります。しかし、私は少し助けることができます。トレースの違いは、バイトが符号付きまたは符号なしとして解釈されるためです。ビットパターンはどちらも同じです。130 = 10000010 (符号なし文字)、および -126 = 10000010 (符号付き文字)

于 2015-01-22T21:37:34.737 に答える