0

ビット/バイトレベルでの操作を行ってからしばらく経ちましたが、これが単純な場合はご容赦ください。

組み込みデバイスから 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 111111112 の補数の -1 は正しいはずですか?

編集

書いたのが自分だということをすっかり忘れていましたEndianArrayUtilsgetShortFromLittleEndianRangeメソッドのコードは

public static short getShortFromLittleEndianRange(byte[] range){
        return (short)((short)(range[1] >> 8) + (short)(range[0]));
    }

明らかに、負の数での操作方法に問題があります。

4

1 に答える 1

5

私はByteBufferを使用します

byte[] valBytes = {(byte)0xff, (byte)0xff};
short s = ByteBuffer.wrap(valBytes).order(ByteOrder.LITTLE_ENDIAN).getShort();
System.out.println(s);

版画

-1

ByteBuffer に読み込む場合は、まったく必要ありませんbyte[]

例を修正するには

public static short getShortFromLittleEndianRange(byte[] range){
    return (short)((range[1] << 8) + (range[0] & 0xff));
}
于 2012-08-30T15:08:27.033 に答える