2011-11-01 5 views
1

ByteBuffer API를 사용하여 개체를 바이트로 변환하고 있습니다. 의 ByteBuffer API를 사용ByteBuffer API가 잘못된 정수 값을 제공합니다.

public class Obj{ 
int a; // size 1 byte 
int b; // size 4 bytes 
int c; // size 4 bytes 
} 

다음과 같이 객체의 클래스이며, I는 I (100)로 B의 값을 설정하지만에서 바이트 배열을 변환 할 때 길이 4까지 1 오프셋

ByteBuffer bbf = ByteBuffer.allocate(9); 
bbf.put((byte) this.getA()); 
bbf.putInt(this.getB()); 
bbf.putInt(this.getC()); 
byte[] msg = bbf.array(); 

개체에게 할당 한 , 나는 다른 정수 값을 얻는다. 어디에서 문제가 발생했는지 알 수 있습니까? 덕분에 !

+0

오프셋은 5이다. 빅 엔디안 또는 리틀 엔디안 값이 필요합니까? –

+0

바이트 순서를 Little Endian으로 설정합니다. 그러나 문제는 아직 거기에있다 –

답변

2

오프셋에서 최대한 멀리 볼 수있는, B는 코드가 정상적으로 작동하고 당신은 참으로 인덱스 1,2,3,4로 선택 바이트는이 값을 산출 할 경우 100 :

ByteBuffer bbf = ByteBuffer.allocate(9); 
bbf.put((byte) 10); 
bbf.putInt(100); 
bbf.putInt(55); 
byte[] msg = bbf.array(); 

byte[] from4to8 = Arrays.copyOfRange(msg, 1, 5); 

ByteBuffer buf2 = ByteBuffer.wrap(from4to8); 
System.out.println(buf2.getInt());    // Prints 100 

일부 참고 : 엔디안 시스템에 대한 시스템과 다를 수 있음을 명심

  • 는 (그래서 엔디안 (을)를 확인 현재의 버퍼의 컨텐츠로

    수정을 반환 된 배열의 내용을 발생합니다 : N이 프로토콜의 일부)

  • 당신이 bbf.array() 전화에서 얻을 배열은 보조 배열, 즉 모두 호스트 인 경우 수정 될 수 있으며 그 반대의 경우도 가능합니다. 0, B : (1) C :

+0

은 LittleEndian으로 바이트 순서로 코드를 시도했습니다. 인쇄 된 값을 1677721600 –

+0

으로 얻습니다. 1,2,3,4 바이트 대신 0,1,2,3 바이트를 사용하면 얻을 수있는 값입니다. (즉, 내 대답의 예에서 1,5에서 0,4로 변경하는 경우). – aioobe

+0

두 번째 메모로 당신은 다른 ByteBuffer 객체를 사용하여 각 인스턴스 변수를 개별적으로 변환해야한다는 것을 의미합니까? 그렇지 않다면 자세히 설명하십시오. –

1

1

+0

오타를 유감스럽게 생각한다. 수정했다. –

관련 문제