이것이 ByteBuffer에서 바이트를 가져 오는 데 권장되는 방법입니까?
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
답변:
하고 싶은 일에 따라 다릅니다.
원하는 것이 (위치와 한계 사이) 남아있는 바이트를 검색하는 것이라면 가지고있는 것이 작동합니다. 다음과 같이 할 수도 있습니다.
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()];
bb.get(b);
이는 ByteBuffer javadocs에 따라 동일 합니다.
bb.slice().remaining()
. 이렇게하면 원래 버퍼를 건드리지 않고 깨끗한 덤프처럼 보입니다.
int
bitmask : 로 캐스트 하고 사용해야합니다 . int unsigned_byte = b[k] & 0xff;
k
ByteBuffer#clear
먼저 호출 하시겠습니까?
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를 지원하는 경우에만 작동합니다. 필요합니다.
주어진 (Direct) ByteBuffer의 내부 상태에 대해 아무것도 모르고 버퍼의 전체 내용을 검색하려는 경우 다음을 사용할 수 있습니다.
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
ByteBuffer.get(byte[])
반환ByteBuffer
data
변수에 있습니다. getter는을 반환합니다 this
. Javadoc을 참조하십시오.
이것은 byte []를 얻는 간단한 방법이지만 ByteBuffer를 사용하는 요점의 일부는 byte []를 생성하지 않아도되는 것입니다. 아마도 ByteBuffer에서 직접 byte []에서 원하는 것을 얻을 수 있습니다.
bb.capacity()
수 와 동일bb.remaining()
후원 배열이 이상 할 때시의 테스트로 자신의 평등을 사용해서는 안 있도록, 심지어bb.array()
맞습니다. 을 참조하십시오ByteBuffer.slice()
.