7

バイトをsigned/unsignedintまたはshortに変換する必要があります。

以下の方法は正しいですか?署名されているものと署名されていないものはどれですか?

バイトオーダー:LITTLE_ENDIAN

public static int convertTwoBytesToInt1(byte b1, byte b2) {
    return (int) ((b2 << 8) | (b1 & 0xFF));
}

VS.

public static int convertTwoBytesToInt2(byte b1, byte b2) {
    return (int) (( (b2 & 0xFF) << 8) | (b1 & 0xFF));
}

public static int  convertFourBytesToInt1(byte b1, byte b2, byte b3, byte b4){
    return (int) ((b4<<24)+(b3<<16)+(b2<<8)+b1);
}

VS.

public static int  convertFourBytesToInt2(byte b1, byte b2, byte b3, byte b4){
    return (int) (( (b4 & 0xFF) << 24) | ((b3 & 0xFF) << 16) | ((b2 & 0xFF) << 8) | (b1 & 0xFF));
}

私はこの変換フォームにのみ興味があります。ありがとう!

4

2 に答える 2

8

convertXXXToInt1()各ペアの最初のメソッド( )は符号付きで、2番目のメソッド( convertXXXToInt2())は符号なしです。

ただし、Javaintは常に署名されているため、の最上位ビットが設定されている場合、これが「署名されていない」バージョンであると想定されていてもb4、の結果は負になります。convertFourBytesToInt2()

byteb2が-1、または16進数で0xFFであるとします。オペレーターは、値が-1または0xFFFFFFFFのタイプ<<に「プロモート」します。int8ビットのシフト後は0xFFFFFF00になり、24バイトのシフト後は0xFF000000になります。

ただし、ビット&演算子を適用すると、上位ビットはゼロに設定されます。これにより、サイン情報が破棄されます。これが2つのケースの最初のステップであり、より詳細に説明されています。

署名:

byte b2 = -1; // 0xFF
int i2 = b2; // 0xFFFFFFFF
int n = i2 << 8; // 0x0xFFFFFF00

署名なし:

byte b2 = -1; // 0xFF
int i2 = b2 & 0xFF; // 0x000000FF
int n = i2 << 8; // 0x0000FF00
于 2012-05-29T17:09:00.873 に答える
1

4バイトの符号なし変換には問題があります。これは、intに適合しないためです。以下のルーチンは正しく機能します。

public class IntegerConversion
{
  public static int convertTwoBytesToInt1 (byte b1, byte b2)      // signed
  {
    return (b2 << 8) | (b1 & 0xFF);
  }

  public static int convertFourBytesToInt1 (byte b1, byte b2, byte b3, byte b4)
  {
    return (b4 << 24) | (b3 & 0xFF) << 16 | (b2 & 0xFF) << 8 | (b1 & 0xFF);
  }

  public static int convertTwoBytesToInt2 (byte b1, byte b2)      // unsigned
  {
    return (b2 & 0xFF) << 8 | (b1 & 0xFF);
  }

  public static long convertFourBytesToInt2 (byte b1, byte b2, byte b3, byte b4)
  {
    return (long) (b4 & 0xFF) << 24 | (b3 & 0xFF) << 16 | (b2 & 0xFF) << 8 | (b1 & 0xFF);
  }

  public static void main (String[] args)
  {
    byte b1 = (byte) 0xFF;
    byte b2 = (byte) 0xFF;
    byte b3 = (byte) 0xFF;
    byte b4 = (byte) 0xFF;

    System.out.printf ("%,14d%n", convertTwoBytesToInt1 (b1, b2));
    System.out.printf ("%,14d%n", convertTwoBytesToInt2 (b1, b2));

    System.out.printf ("%,14d%n", convertFourBytesToInt1 (b1, b2, b3, b4));
    System.out.printf ("%,14d%n", convertFourBytesToInt2 (b1, b2, b3, b4));
  }
}
于 2014-03-17T23:12:56.473 に答える