2017-12-18 9 views
1

入力として2つのjavaバイトが得られ、それらは一緒に16ビット符号付き整数を表します。私は単一のJava整数(もちろん署名)に変換する必要があります。私はint型に変換し、次にshort型に変換し、int型に戻すという「醜い」ソリューションを考え出しました。より短くてエレガントな方法がありますか? - それは簡単ですが、それは確かにそれほど冗長である特定のないこのバイナリからJavaへのコードを簡素化する方法は?

public int convert(byte b1, byte b2){ 
    int i1 = (int) (((b2 << 8) + (b1 & 0xFF)) & 0x0000FFFF); 
    short s1 = (short) i1; 
    int i2 = (int) s1; 
    return i2; 
} 
+0

'return(short)i1;'は自動的に拡大を使用して簡単になります。 –

+0

しかし、私は最後にint(短いものではない)を得なければなりません(伝統的な理由から)。 – alebo611

+0

'return(short)i1;'は最後の3行と同じです。ピンキーな誓い。 –

答えて

1

をこれはあなたのコンバータに合わせているようだ: 私のコードは次の通りです。

public int convert2(byte b1, byte b2) { 
    return new BigInteger(new byte[]{b2,b1}).intValue(); 
} 
+0

興味深い解決策は、試してみます。私はパフォーマンスが重要ではないということを忘れていました。私はこれらの数字のトーンをリアルタイムで変換する必要があります。 – alebo611

1

以下に等しい:

return (short) ((b2 << 8) | (b1 & 0xFF)); 

byteは、b1b2のすべての可能な値について、この等価性をテストするために実用的であることが十分に小さい範囲を有する:

byte b1 = Byte.MIN_VALUE; 
do { 
    byte b2 = Byte.MIN_VALUE; 
    do { 
    assertEquals(convert(b1, b2), convertEquivalent(b1, b2)); 
    } while (b2++ != Byte.MAX_VALUE); 
} while (b1++ != Byte.MAX_VALUE); 

Ideone demo

0

@AndTurnerはおそらくあなたが求めている解決策です。

しかし、バイト配列またはファイルチャネル(メモリマップファイル)、入力ストリームが関係する場合、ByteBufferを使用することができます。

byte[] bytes = ... 
ByteBuffer buf = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN); 
... 
short n = buf.readShort(); // Sequential 
short m = buf.readShort(354L); // Direct access 
関連する問題