ビット/バイトレベルでの操作を行ってからしばらく経ちましたが、これが単純な場合はご容赦ください。
組み込みデバイスから Java アプリケーションの TCP ソケット経由でデータを受信しています。データはリトル エンディアン (最下位バイトが最初) で、現在short
、データの配列から値を取得しようとしています。これを行うには、次のコードを使用しています。
byte[] valBytes = {data[0], data[1]};
short val = EndianArrayUtils.getShortFromLittleEndianRange(valBytes);
これは正の数に対しては問題なく機能しますが、short
-1 のはずなのに、代わりに -2 を取得しています。-2 を生成するデータは次のとおりです。
byte[] valBytes = {(byte)0xff, (byte)0xff};
short val = EndianArrayUtils.getShortFromLittleEndianRange(valBytes);
何か不足していますか?11111111 11111111
2 の補数の -1 は正しいはずですか?
編集
書いたのが自分だということをすっかり忘れていましたEndianArrayUtils
。getShortFromLittleEndianRange
メソッドのコードは
public static short getShortFromLittleEndianRange(byte[] range){
return (short)((short)(range[1] >> 8) + (short)(range[0]));
}
明らかに、負の数での操作方法に問題があります。