2011-08-01 25 views
5

Estoy usando la biblioteca Naga para leer datos de un socket, que produce matrices byte[] que se reciben a través de una función de delegado.¿Diseccionar una matriz de bytes en distintos tipos de datos?

Mi pregunta es, ¿cómo puedo convertir esta matriz de bytes en tipos de datos específicos, conociendo la alineación?

Por ejemplo, si la matriz de bytes contiene los datos siguientes, en orden:

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

¿Cómo puedo extraer esos tipos de datos (en Little Endian)?

Respuesta

8

Sugiero que eche un vistazo a la clase ByteBuffer (específicamente el método ByteBuffer.wrap y los diversos métodos getXxx).

clase Ejemplo:

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

Esto se puede lograr usando ByteBuffer y ScatteringByteChannel así:

 
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); 
Cuestiones relacionadas