2013-02-12 7 views
17

私は、配列内のデータが実際に短いデータであるバイト配列を持っています。バイトは、リトルエンディアンで順序付けされる:リトルエンディアン順のバイト配列値をshort値に変換する

259、208、:短い値結果に変換

3、1、-48、0、-15、0、36、1

を241,292

バイト値を対応する短い値に変換する簡単な方法はありますか?私はすべての上位バイトを取って、それを8ビットシフトし、その下位バイトでORするループを書くことができますが、それはパフォーマンスが低下します。

+2

あなたが与えてくれました8バイト、次に4ロング... 8バイトは*単一*ロング値になるはずです。また、あなたはあなたが何を期待しているかは言いませんでした。基本的にあなたの質問は現時点では非常に不明です... –

+1

いいえ、それは不明ではありません。バイト配列のデータと変換先のデータがあります。それ以上に明白ではありません。 – AndroidDev

+8

はい、できます。実際にあなたが「短い」、「長くはない」に変換されているように聞こえるので、あなたはあなたが*期待していることを*結果にするとは言いませんでした。質問をもっと明確にしないように気をつけてください。しかし、あなたが援助を求めていることを覚えておいてください。あなたの質問が良くなればなるほど、助けがより良くなるでしょう。 –

答えて

38

java.nio.ByteBufferとすると、必要なエンディアンを指定することができます。order()

ByteBufferのバイト、文字、getShort()getInt()、長い、二重のようなデータを抽出するためのメソッドを持っている...

ここではそれを使用する方法の例です:

ByteBuffer bb = ByteBuffer.wrap(byteArray); 
bb.order(ByteOrder.LITTLE_ENDIAN); 
while(bb.hasRemaining()) { 
    short v = bb.getShort(); 
    /* Do something with v... */ 
} 
+1

ありがとうございます。たくさん助けてくれました。誰かが簡単に問題を理解することができてうれしいです。感謝万円。 – AndroidDev

+1

(質問のサンプルデータによると、 'getLong()'が* 2バイトを変換するとは思わないので、 'getShort()'を呼び出すことをお勧めします) –

+0

実際には、私の結果。それでも、あなたのソリューションは正しいものです。 – AndroidDev

0
/* Try this: */ 
public static short byteArrayToShortLE(final byte[] b, final int offset) 
{ 
     short value = 0; 
     for (int i = 0; i < 2; i++) 
     { 
      value |= (b[i + offset] & 0x000000FF) << (i * 8); 
     }    

     return value; 
} 

/* if you prefer... */ 
public static int byteArrayToIntLE(final byte[] b, final int offset) 
{ 
     int value = 0; 

     for (int i = 0; i < 4; i++) 
     { 
      value |= ((int)b[i + offset] & 0x000000FF) << (i * 8); 
     } 

     return value; 
} 
関連する問題