Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > byte[] to object

Buenas gente!

Les hago una consulta, supongan que tengo un objeto de la siguiente clase:


public class MiClase
{
short campo1;
short campo2;
char[] campo3 = new char[5];
short campo4;
}

Por otro lado, tengo un objeto del tipo byte[11] que tiene el mismo tamaño que mi clase. Como puedo hacer para que los campos de mi objeto se inicialicen en el orden que estan cargados en byte[11]. Yo trabaje mucho con C, y si mi clase fuera un "struct" y el byte[11] fuera char[11], simplemente hacia un "memcpy", pero en java no se como.

Gracias
Saludos!

junio 14, 2014 | Unregistered CommenterNico

Buenas,

Me da la sensación de que el problema es que sigues programando y pensando en C, aunque utilices la sintaxis y compilador de Java.

No se puede hacer un memcpy directo, ya que tienes que tener en cuenta el overhead del objeto, de 16 bytes, así como un padding para hacer la estructura un múltiplo de 8 bytes.
En tu caso, el objeto de tipo MiClase tendria un tamaño en memoria de: 16 + (3*2) + (5*2) + 0 = 32 bytes.

Object Overhead: 16 bytes
short: 2 bytes
char (unicode): 2 bytes
0 bytes de padding ya que el objeto es ya múltiplo de 8

Como respuesta a tu pregunta, la mejor solución sería utilizar System.arraycopy
http://docs.oracle.com/javase/8/docs/api/java/lang/System.html#arraycopy-java.lang.Object-int-java.lang.Object-int-int-


Un saludo

junio 14, 2014 | Unregistered CommenterUnoPorAhi

No entiendo bien lo que quieres hacer; pero, como dice Uno, no estás "pensando en Java".

Esto no tiene sentido alguno en Java: "Como puedo hacer para que los campos de mi objeto se inicialicen en el orden que estan cargados en byte[11]"

Sería mejor que explicases lo que quieres lograr, olvidándote de conceptos traídos de otro lenguaje de programación.

junio 14, 2014 | Registered Commenterchoces

Todavia no pude probar lo de UnoPorAhi.

Asi recibo los datos choces, en ese formato. Vienen de un sistema externo el cual no tengo alcance. Y en C lo asi hacia. Para el ejemplo que puse, seria sensillo parsear campo por campo, pero en una clase que tiene 500 campos? Por eso hago esto.

junio 14, 2014 | Unregistered CommenterNico

Si los recibes así, como un byte[] creo que necesitarás desarrollar un parser de ese byte[] para poder inicializar las propiedades de la clase de destino.

Lamentablemente, arraycopy no te va a funcionar, por lo siguiente:

Otherwise, if any of the following is true, an ArrayStoreException is thrown and the destination is not modified:

The src argument refers to an object that is not an array.
The dest argument refers to an object that is not an array.
The src argument and dest argument refer to arrays whose component types are different primitive types.
The src argument refers to an array with a primitive component type and the dest argument refers to an array with a reference component type.
The src argument refers to an array with a reference component type and the dest argument refers to an array with a primitive component type.

junio 14, 2014 | Registered Commenterchoces

Entonces tengo que hacer el parser campo por campo, para cada clase? :( :( :(

junio 14, 2014 | Unregistered CommenterNico

Me temo que sí. No hay ninguna manera de "convertir" un array en una instancia de clase.

junio 14, 2014 | Registered Commenterchoces

Y un array a un struct y este a una clase? :S :S

junio 14, 2014 | Unregistered CommenterNico

No hay "struct" en Java.

junio 14, 2014 | Registered Commenterchoces