私がする必要があるのは、符号なし2バイト配列を整数に変換することだけです。Javaには符号なしデータ型がないことはわかっていますが、私の数値は符号なしバイトのふりをしています。
byte[] b = {(byte)0x88, (byte)0xb8}; // aka 35000
int i = (byte)b[0] << 8 | (byte)b[1];
問題は、それらが符号付きバイトであると見なされるため、正しく変換されないことです...どうすればintに戻すことができますか?
私がする必要があるのは、符号なし2バイト配列を整数に変換することだけです。Javaには符号なしデータ型がないことはわかっていますが、私の数値は符号なしバイトのふりをしています。
byte[] b = {(byte)0x88, (byte)0xb8}; // aka 35000
int i = (byte)b[0] << 8 | (byte)b[1];
問題は、それらが符号付きバイトであると見なされるため、正しく変換されないことです...どうすればintに戻すことができますか?
Java、bytes、intsなどに符号なしの数値はありません。バイトがビットシフトされるint
前に変換されると、符号拡張されます。つまり、0x88
=>0xFFFFFF88
です。不要なものを隠す必要があります。
これを試して
int i = ((b[0] << 8) & 0x0000ff00) | (b[1] & 0x000000ff);
そしてあなたは35000を得るでしょう。
使用できます
int i = ((b[0] & 0xFF) << 8) | (b[1] & 0xFF);
また
int i = ByteBuffer.wrap(b).getChar();
また
int i = ByteBuffer.wrap(b).getShort() & 0xFFFF;