2017-02-28 13 views
1

このメッセージを(変更なしで)AMQPブローカーに転送するPonte(Node.js)アプリケーションにバイナリデータを送信するツールを使用しています。javaからjavascriptへの切り替え時にバイト配列が更新される理由

全体:Java - > JavaScript - > Java そして私はバイナリデータの奇妙な変換があります。

私はバイナリデータを準備

が、それはこのようになります設定:ここでは、彼らが表示されるために、HEX値である

[4, -30, -30, -9, -115, 0, 1, 0, 1, 0, 96, -32, 46, 0, 0, 0] 

それにはJavaScript(ポンテ)に到着し、それは次のようになります。

[4, 226, 226, 247, 141, 0, 1, 0, 1, 0, 96, 224, 46, 0, 0, 0] 

ここで、負の小数点は正の小数点に変わります。これらの値を「引く」と、値が256であることが分かります。

このデータは、JavaScriptからAMQPブローカー経由でJavaに送信されます。 Javaでは

私のバイナリデータは、次のようになります。

[4, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, 0, 1, 0, 1, 0, 96, -17, -65, -67, 46, 0, 0, 0] 

それはまだ前のように似ていますが、マイナスからプラスになったすべての小数は今、Javaでは

-17, -65, -67, 

になりました私はバイト配列で作業しており、JavaScriptではバッファで作業しています。誰もこの奇妙な行動がどこから来たのか説明できますか?

私の問題についての詳細情報が必要な場合は教えてください。

ありがとうございました!

+2

Javaは** signed **バイトです。何が起こっているのかを本当に理解するために。おそらく[mcve]を提供する必要があります – GhostCat

+0

@GhostCatより一般的には、符号付き数字(=プリミティブ) – ControlAltDel

答えて

3

これはポンテおよびJava

[4、-30、-30、-9、-115、0、1、0、1、0、96、との間の符号付き/符号なしの問題が明らかに - 32、46、0、0、0]

[4、226、226、247、141、0、1、0、1、0、96、224、46、0、0、0]

慎重に見れば、負の値はその値に256を加えてその等価な補数になります。

はポンテ側あなたは符号付き8ビット数

[4、226、226、247、141、0、1、0、1、0、96にこの配列をバック変換するために計算を行うことができ、 224、46、0、0、0]

だけで127以上のすべての数字のbigggesいることを確認してくださいあなたがする必要があるので、Java側では陰性であった:

数> 127その後、数ある場合 - = 256

+0

ありがとうございます!私はPonte内でこれを処理できますか?最初のJavaアプリケーションからのデータは変更できません。 –

+0

HI @MK、確かに値を変換してください....もし127より大きい数値igがあれば、それは256で休憩する必要があるので、負であったでしょう。 –

+0

しかし、私は同じ問題を抱えていませんか?これは、JavaScriptで符号付き配列を再度持つことを意味します。それとも、最初の変換だけですか?そして、これはどんな文字列にも影響しますか?現在私は半分の文字列、半分のバイナリデータを送っています –

1

すべてがあなたと関係しています(私はプロ文法言語)は8ビットを解釈する。 Javaでは、最初のビットは符号ビットですが、JavaScriptでは最初のビットはその番号の最大ビットのように扱われます。データごとに、2つの値は等価です。この切り替えを防止したい場合は、charまたはintのようなより大きなプリミティブ値を使用する必要があります。

+0

あなたの返信ありがとう!私はすでに何か類似していると思った。 問題は、私はJavaから来ているデータを変更できないということです。今はこのバイナリデータをシミュレートしているからです。後でそれは外部から来るだろう。私は支配権を持っていない。 しかし、私はJavaScriptの部分を制御し、Javaの部分に2番目のメッセージが送信されたとき(ただし、データがすでに間違った形式で届いています)。 JavaScriptの部分でこれを処理できますか? おかげで再び! –

関連する問題