2016-12-20 18 views
0

私のC++コードでは、intを変換してバイトの中に入れる必要があります。私はcharを使ってバイトを表現しています。 私のJavaコードでは、これはbyte(ネットワークを介して送信されます)を読む必要があり、そのバイト(私が送信したもの)から適切なintを取得する必要があります。JavaとC++の整数から整数

私はこのバイトが15未満であることを言及する必要があり、それは

しかし、Javaコードは、いくつかの試みに負の数を読んでいるために1つのバイトで十分だろう、と私は他の方法を試したとき、それは完全に私を与えました異なる数字。私はそれが大きな/リトルエンディアンの問題だと思う。

私が試した:

// C++ 
char bytes[255]; 
bytes[0] = myInt; // attempt 1 
bytes[0] = myInt & 0xFF; // attempt 2 
// ... send the byte array over the network 

// JAVA 
// receive the byte 
int readInt = bytes[0]; //attempt 1 
int readInt = bytes[0] & 0xFF; // attempt2 

は、どのように私はこれを適切に行う必要があり、二つのアプリケーション(C++側とJava側が)同じUbuntuマシン上で実行されることを考えると?

+0

エンディアンの問題のようですね。 – NathanOliver

+2

あなたが書いて読んでいるものの長さがちょうど1バイトであれば、それはエンディアンの問題ではありません。値が間違いなく15未満であれば、私は試みがうまくいくと思うでしょう。試み2はエンディアンの問題に走ります。 – flu

+1

あなたのデバッガはバイト単位で何を言っていますか?そうでなければ、できることは推測です。 – UKMonkey

答えて

1

さらに編集:int readInt = bytes[0] & 0xFFが動作するはずです。

for (int i = 0; i < 256; i++) { 
    byte b = (byte) i; 
    int j = b & 0xFF; 
    System.out.println("The byte is " + b + " and the int is " + j); 
} 

を与える:

The byte is 0 and the int is 0 
The byte is 1 and the int is 1 
... 
The byte is 126 and the int is 126 
The byte is 127 and the int is 127 
The byte is -128 and the int is 128 
The byte is -127 and the int is 129 
... 
The byte is -2 and the int is 254 
The byte is -1 and the int is 255 

編集(上記のコメントの後):7 = 0000 0111 and -32 = 1110 0000 (= 224 as int)問題は、フリップをミラーリングのいくつかの種類のように見えます。

および170 = 1010 1010 (= -86 as Java byte)これは3ビットがどのように4に変わって広がったのかがわからないからです。

+0

これは私に 'readInt = 170'を与えてくれました.C++側に' 7'を入れました – TheNotMe

1

注:はありませんエンディアンの問題です。あなたが低レベルで働いている場合、または自分のバイトの配列を1つの数字を表すようにする場合のみ、エンディアンの問題かもしれません。

これは現在1バイトであるため、エンディアンの問題はありません。

unsigned intを使用してください。

+0

Javaでunsigned intを見たことがありますか?あなたの答えがどのようにOPに役立つのか分かりません... –

+0

私はまだコメントを投稿できません。エンディアンに関する他の回答についてのコメントはエラーにつながる可能性があります。私はそれが答えではないことを知っていますが、他のどこにも書くことができませんでした、申し訳ありません。 –

+0

どこにでもコメントを書くことができます。この特権には、76を持っている間に50の評判が必要です。このような回答を投稿し続ければ、この特権を失うかもしれないことを忘れないでください... –