2016-11-04 3 views
2

私はbyte[]intを変換しようとしたと、この次のために書いた:intをbyte []に​​変換する方法は?

byte[] bytes = new bytes[4]; 
ByteBuffer buff = ByteBuffer.allocate(4); 
buff.putInt(1222); 
buff.get(bytes); 

が、結果として、私は詳細メッセージなしjava.nio.BufferOverflowExceptionを持っていました。

私のコードは有効です。なにが問題ですか?どのようにintbyte[]に変換するのですか?

+0

エラーが発生したのは、どのラインですか? – arminb

+0

buff.get(bytes) –

答えて

5

あなたにはデータを入れた後、あなたのバッファをflip()のを忘れていました。

あなたがバッファにintを入れた後は、位置がバッファの末尾にあります。データを読み込もうとすると、バッファに読み込むバイトが残っていないので、(オーバーフローしないで)BufferUnderflowExceptionになります。

6

flip()を呼び出す必要のない同様の回答です。 http://ideone.com/Ab4Z4V

[18, 52, 86, 120] 

byte[] bytes = new byte[4]; 
ByteBuffer.wrap(bytes).putInt(0x12345678); 
System.out.println(Arrays.toString(bytes)); 

プリントは、これは0x12を、0x34の、0x56と0x78と

独自のソリューションと同様に
2

ですが、もう少し簡潔に、結果はバイト配列に直接です。

byte[] bytes = new byte[4]; 
    // BigEndian 
    ByteBuffer.wrap(bytes).putInt(1222); 
    // LittleEndian 
    ByteBuffer.wrap(bytes).order(LITTLE_ENDIAN).putInt(1222); 
0

これは、それを達成するための私のアプローチです:

public static byte[] intToByteArray(int value) { 
    if ((value >>> 24) > 0) { 
     return new byte[]{ 
      (byte) (value >>> 24), 
      (byte) (value >>> 16), 
      (byte) (value >>> 8), 
      (byte) value 
     }; 
    } else if ((value >> 16) > 0) { 
     return new byte[]{ 
      (byte) (value >>> 16), 
      (byte) (value >>> 8), 
      (byte) value 
     }; 
    } else if ((value >> 8) > 0) { 
     return new byte[]{ 
      (byte) (value >>> 8), 
      (byte) value 
     }; 
    } else { 
     return new byte[]{ 
      (byte) value 
     }; 
    } 
} 

は数が少ない場合には、意味、このアプローチが唯一の数を表すためにを必要なバイト数を使用することを、覚えておいてくださいバイト数を減らしてください。

関連する問題