2012-12-14 3 views
2

바이트 배열에 대한 모든 클래스의 필드 :이 제한이 도입 왜직렬화와 같은 내가 자바 클래스가

내가 바이트 배열에 모든 필드를 포장 할
class Foo implements IBar 
{ 
    // Methods .. 

    // A bunch of fields of primitive types (int, String) 
    int f1; 
    int f2; 
    String f3; 
    // ... 
} 

(묻지 않는다 그러한 형식의 데이터를 보내는 C++ 측).

유일한 방법은 ByteBuffer입니다. 하지만 내가 생각할 수있는 최악의 경우입니다. 코드는 다음과 같습니다.

ByteBuffer buf = ByteBuffer.allocate(4); 

int offset = 0; 

buf.putInt(f1); 
System.arraycopy(buf.array(), 0, rawHeader, offset, 4); 
offset += 4; 

// A bunch of lines here (pack all other fields) 

누구나보다 적합한 방법을 알고 있습니까? 감사.

+1

ints/floats는 어떤 순서로 포장됩니까? 빅 엔디안 인 경우 DataOutputStream 응답이 작동합니다. 리틀 엔디안이라면 ByteBuffer가 구성 가능하기 때문에 가장 좋은 옵션 일 수 있습니다. –

+1

왜 전체 결과에 대해 하나의 ByteBuffer를 할당하지 않고 2 차 배열로 복사하는 대신 계속 패킹을 유지해야합니까? – jtahlborn

+0

@jtahlborn, 좋은 아이디어, 감사합니다. – maverik

답변

4

ByteArrayOutputStream을 포장하는 DataOutputStream을 사용하십시오.

또는 원하는 경우, 클래스가 Serializable을 구현하고 ByteArrayOutputStream을 감싸는 ObjectOutputStream를 사용합니다. 물론 자바에 의해서만 읽을 수있는 바이트 배열을 만들 것입니다.

+0

죄송합니다. 방금 게시물을 보았습니다. :) – Andremoniy

2

음 ... ByteBufferStream을 통해 DataOutputStream을 시도해 볼 수 있습니다. 프리미티브를 작성하는 편리한 방법이 있습니다. 종료시 바이트 배열이 있습니다.

UPD : 물론 ByteBufferStream이 아니라 ByteArrayOutputStream입니다.