Java의 ByteBuffer에서 바이트 배열을 가져옵니다.


95

이것이 ByteBuffer에서 바이트를 가져 오는 데 권장되는 방법입니까?

ByteBuffer bb =..

byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);

답변:


107

하고 싶은 일에 따라 다릅니다.

원하는 것이 (위치와 한계 사이) 남아있는 바이트를 검색하는 것이라면 가지고있는 것이 작동합니다. 다음과 같이 할 수도 있습니다.

ByteBuffer bb =..

byte[] b = new byte[bb.remaining()];
bb.get(b);

이는 ByteBuffer javadocs에 따라 동일 합니다.


6
옳은. 그리고 주 bb.capacity() 와 동일 bb.remaining()후원 배열이 이상 할 때시의 테스트로 자신의 평등을 사용해서는 안 있도록, 심지어 bb.array()맞습니다. 을 참조하십시오 ByteBuffer.slice().
cdunn2001

1
버퍼의 위치 변경을 피하기 위해 bb.slice().remaining(). 이렇게하면 원래 버퍼를 건드리지 않고 깨끗한 덤프처럼 보입니다.
Kyll

이 방법은 서명 된 바이트를 제공하지만 서명되지 않은 것을 원합니다 ... 어떤 생각이 있습니까?
H Raval

Java에는 부호없는 정수라는 개념이 없으며 부호있는 정수만 있습니다. "부호없는 바이트"를 원하는 경우 일부 값에 대해 intbitmask : 로 캐스트 하고 사용해야합니다 . int unsigned_byte = b[k] & 0xff;k
Jason S

전체 버퍼를 바이트 배열로 가져 오려면 ByteBuffer#clear먼저 호출 하시겠습니까?
Kenny Worden

21

bb.array ()는 바이트 버퍼 위치를 따르지 않으며 작업중인 바이트 버퍼가 다른 버퍼의 슬라이스 인 경우 더 나쁠 수 있습니다.

byte[] test = "Hello World".getBytes("Latin1");
ByteBuffer b1 = ByteBuffer.wrap(test);
byte[] hello = new byte[6];
b1.get(hello); // "Hello "
ByteBuffer b2 = b1.slice(); // position = 0, string = "World"
byte[] tooLong = b2.array(); // Will NOT be "World", but will be "Hello World".
byte[] world = new byte[5];
b2.get(world); // world = "World"

당신이하려는 것이 아닐 수도 있습니다.

실제로 바이트 배열을 복사하지 않으려면 해결 방법은 바이트 버퍼의 arrayOffset () + left ()를 사용하는 것입니다. 그러나 이것은 응용 프로그램이 바이트 버퍼의 index + length를 지원하는 경우에만 작동합니다. 필요합니다.


"bb.array ()는 바이트 버퍼 위치를 존중하지 않습니다."이 부분에 대한 자세한 내용을 제공 할 수 있습니까? 슬라이스 예제를 이해했지만 왜 bb.array ()가 엉망인지에 대한 자세한 내용이 필요합니다
kkrishnaai

5

저것과 같이 쉬운

  private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
    byte[] bytesArray = new byte[byteBuffer.remaining()];
    byteBuffer.get(bytesArray, 0, bytesArray.length);
    return bytesArray;
}

4
final ByteBuffer buffer;
if (buffer.hasArray()) {
    final byte[] array = buffer.array();
    final int arrayOffset = buffer.arrayOffset();
    return Arrays.copyOfRange(array, arrayOffset + buffer.position(),
                              arrayOffset + buffer.limit());
}
// do something else

4

주어진 (Direct) ByteBuffer의 내부 상태에 대해 아무것도 모르고 버퍼의 전체 내용을 검색하려는 경우 다음을 사용할 수 있습니다.

ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);

ByteBuffer.get(byte[])반환ByteBuffer
pyb

과...? 무슨 말인지 잘 모르겠습니다. 죄송합니다.
Tomáš Myšík

문제는 ByteBuffer에서 byte []로 이동하는 방법입니다.
pyb

2
일단 호출되면 data변수에 있습니다. getter는을 반환합니다 this. Javadoc을 참조하십시오.
Tomáš Myšík

감사합니다. 인식하지 못했습니다. get 메서드가 값을 반환하므로 부작용도있을 것으로 예상하지 못했습니다.
pyb

1

이것은 byte []를 얻는 간단한 방법이지만 ByteBuffer를 사용하는 요점의 일부는 byte []를 생성하지 않아도되는 것입니다. 아마도 ByteBuffer에서 직접 byte []에서 원하는 것을 얻을 수 있습니다.


15
그러나 종종 byte []를 사용하는 무언가 (자신의 코드가 아닌)를 호출해야하므로 변환은 선택 사항이 아닙니다.
James Moore
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.