2011-08-01 10 views
5

Używam biblioteki Naga do odczytywania danych z gniazda, które generuje tablice byte[], które są odbierane za pośrednictwem funkcji delegowania.Czy można rozłożyć tablicę bajtów na różne typy danych?

Moje pytanie brzmi, w jaki sposób mogę przekonwertować tę tablicę bajtów na konkretne typy danych, znając wyrównanie?

Na przykład, jeśli tablica bajt zawiera następujące dane, w celu:

| byte | byte | short | byte | int | int | 

Jak można wyodrębnić te typy danych (w little endian)?

Odpowiedz

8

Proponuję zapoznać się z klasą ByteBuffer (w szczególności z metodą ByteBuffer.wrap i różnymi metodami getXxx).

Przykład Klasa:

class Packet { 

    byte field1; 
    byte field2; 
    short field3; 
    byte field4; 
    int field5; 
    int field6; 

    public Packet(byte[] data) { 
     ByteBuffer buf = ByteBuffer.wrap(data) 
            .order(ByteOrder.LITTLE_ENDIAN); 

     field1 = buf.get(); 
     field2 = buf.get(); 
     field3 = buf.getShort(); 
     field4 = buf.get(); 
     field5 = buf.getInt(); 
     field6 = buf.getInt(); 
    } 
} 
1

Można to osiągnąć za pomocą ByteBuffer i ScatteringByteChannel tak:

 
ByteBuffer one = ByteBuffer.allocate(1); 
ByteBuffer two = ByteBuffer.allocate(1); 
ByteBuffer three = ByteBuffer.allocate(2); 
ByteBuffer four = ByteBuffer.allocate(1); 
ByteBuffer five = ByteBuffer.allocate(4); 
ByteBuffer six = ByteBuffer.allocate(4); 

ByteBuffer[] bufferArray = { one, two, three, four, five, six }; 
channel.read(bufferArray); 
Powiązane problemy