2016-07-01 4 views
0

センサーから値を読み取るためにピクチャを使用していますが、センサ範囲外の値を受け取ります。私はそれが変換の問題かもしれないと思う。2の補数、高い値を与えるintへのバイト

2つのバイトが受信:ここ

long readvalue=(long)((i2coctetlist[0] << 8) | (i2coctetlist[1])); 

そして例:01111111 11001101と結果:32717

エラーがある これは私が使用しているコードがあります私のコードで?

おかげ

答えて

0

原因は、Java内のすべてのタイプが署名と広いタイプに変換するときの値が符号拡張されていることです。これは明示的キャスト((long))と操作による自動変換(x<<yは少なくともintに変換されます。x|yと同じ - オペランドは少なくともintに変換されます)。 0xfffffff0にこの(0x00<<8)|(0xf0)結果に

秒(実際には両方)オペランドが最初0xfffffff0に変換され、|操作が行われたからです。

ソリューションは、intに変換し、バイトマスクを適用するバイト0xffで常にマスクすることである。

int readValue = (byte0&0xff)|((byte1&0xff)<<8)|... 
// if needed, conversion to long should also mask 32 bits 
long longValue = readValue&0xffffffffL; 
+0

私はマスクをしてみましたが、それは同じ値を与え、実際にはそれが通り、通常のようです0111111111001101は10進数で32717ですが、問題は別の場所にあるはずです... – Entretoize

関連する問題