2009-04-27 3 views
5

シリアルポートを使用して別のシステムからデータを読み取っています。私は133バイトのパケットを読んでいます。 2番目のバイトはパケット番号で、3番目のバイトはパケット番号の負の値です。-128未満のJavaで負のバイト値を読み取る方法

問題は、私はそれは私が何をすべき127

として値が得られます(バイトの範囲外)-129を読んしようとするタイプbyteは-128〜127の範囲を持っているということですだから私は-129を得ることができますか?

答えて

6

バイトがわずか8ビットであるため、値が折り返されているため、127が得られます。 -129はJavaバイトに収まりません。与えられた変数に-129を当てはめたい場合は、少なくとも短絡を使用するようにプログラムを修正する必要があります。

+0

(int)(byteval&0xFF)正しい値を+ 127、つまり-128を128として返しますが、ネガティブな値は得られません。 –

+0

バイトは任意の256の値の範囲にすることができます。バイトがゼロ以上になることが分かっているならば、0から255までのどこでもかまいません。 "byteval&0xFF"と言うことで、コンパイラには符号なし整数であることが多かれ少なかれ分かりますゼロである。あなたは、負であることが事前に分かっているバイト値を持っていると言っていますか? –

8

バイト値にどの程度の範囲があるかを判断する必要があります。 -129〜126の範囲を期待している場合は、使用することができます。

int min = 129; 
int i = ((b + min) & 0xFF) - min; 

BTW値は256を超えることはできません。

4

私はプロトコルを知らないので、私はここで少し推測する必要があります。

おそらく両方の値はプロトコルの符号なし(正の)バイトとして扱われるべきですが、後でintに変換できるのは です。

// 0-255 
int plus = (int)(plusByte & 0xFF); 

// -255 - 0 
int minus = 0 - (int)(minusByte & 0xFF); 

これは、Us Pat 6313763に関連していますか?しかし、パケットの長さが固定されているので、私はそれを取得しません。

バイトの範囲256より大きい数値を格納することはできません。おそらくあなたはプロトコルを誤解していて、2バイトで格納されているintの上位ビットと下位ビットはどうでしょうか?

1

-128より小さい値は、符号付きバイトに適合しません。