Casting byte[] vers int[] ou long[]

Casting byte[] vers int[] ou long[] - Java - Programmation

Marsh Posté le 25-05-2009 à 23:57:07    

Bonjour, je cherche mais en vain un moyen de convertir un tableau du type primitif byte vers un tableau de int.
D'après la spec, la taille d'un byte est de 1 octet, contre 4 octets pour un int.
Je voudrais pouvoir faire ça en gros :
int[] i;
byte[] b = {0,0,0,1};
i = (int[])b
System.out.print(i[0]);  affiche : 1

 

plus dans le contexte :
void fonction(byte[] b) {
int[] data = (int[])b;
for(int i = data.length; i > 0; i--)
    data[i] ^= un_bitmask_32_bits
}

 

i.length serrait egal à b.length/4. Je comprend que le compilateur refuse, il faudrait détruire 'b' pour remplacer par exemple son champ length, et penser aux soucis d'alignements; mais ce qui m'intéresse, ce serrai de pouvoir travailler a partir de données brutes, sans avoir à les recopier.
Je travail sur des socketsChannel qui n'acceptent que des ByteBuffer en entrée, ceci ne fonctionnant qu'avec le type byte[].
J'ai besoin d'effectuer des opérations sur tous les octets qui transitent, faire des opérations booléennes. Il serrait naturel en C de travailler avec un tableau de int voir de long afin de traiter les octets par paquets de 4 ou 8, et ainsi effectuer bien plus vite. Etant au niveau des socket, c'est une fonction très souvent appelée et ce gain ne serrai pas un luxe.
Une idée ? J'aimerai ne pas en arriver à envisager d'écrire du bytecode à la main ?

  


Message édité par skirb le 26-05-2009 à 00:00:59
Reply

Marsh Posté le 25-05-2009 à 23:57:07   

Reply

Marsh Posté le 26-05-2009 à 09:28:34    

la seule manière que je vois est de le faire un par un, dans une boucle:
 
byte[] b = {0,0,0,1};
int[] i=new int[b.length];
for(int k=0;k<i.length;k++){
 i[k]=b[k];
}

Reply

Marsh Posté le 26-05-2009 à 09:43:33    

Merci, c'est effectivement ce que je me suis résolu à faire pour le moment, mais ça reste relativement inefficace d'après mes tests.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed