2012-05-29 13 views
7

バイトをsigned/unsigned intまたはshortに変換する必要があります。2バイトから4バイトをsigned/unsigned short/intに変換します

以下の方法は正しいですか?署名されている署名付き署名は何ですか?

バイト順: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)); 
} 

私は、この変換の形でのみ興味があります。ありがとう!

+1

これは、はるかに効率的にすることができ、あなただけの 'convertFourBytesToInt1 b1ので –

答えて

6

各ペアの最初のメソッド(convertXXXToInt1())が署名され、2番目のコード(convertXXXToInt2())は符号なしです。

ただし、Java intは常に署名されているので、b4の最上位ビットが設定されている場合、convertFourBytesToInt2()の結果は、これは「符号なし」バージョンであることを想定しているにもかかわらず、マイナスになります。

byteの値がb2の場合は-1、または16進数の場合は0xFFとします。 <<演算子は、値が-1または0xFFFFFFFFのintタイプに昇格させます。 8ビットシフト後は0xFFFFFF00、24バイトシフト後は0xFF000000となります。

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

は署名:

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

符号なし:それはint型に収まらないので

byte b2 = -1; // 0xFF 
int i2 = b2 & 0xFF; // 0x000000FF 
int n = i2 << 8; // 0x0000FF00 
+0

が持って&0xffではありません' .ORDER(ByteOrder.LITTLE_ENDIAN)を設定することができますように私は入れていないので、もし私が...のByteBufferを使用します違いはありませんか?まだintに署名されていますか? – blackwolf

+0

@blackwolf実際には、バイトを '+'演算子と組み合わせているので違いがあります。他の人はビット操作のために好まれる '|'演算子を使っているので、前に気付かなかった。式は '(int)((b4&lt; 24)|((b3&0xFF)<< 16)|((b2&0xFF)<< 8)|(b1&0xFF))' – erickson

1

は、4バイトの符号なし変換に問題があります。以下のルーチンは正しく動作します。

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)); 
    } 
} 
+0

となります。 &0xFF? – ScottF

+0

@ScottF - 負の値を防ぐ。 – dmolony

関連する問題