Conversion byte[4] en int

Conversion byte[4] en int - Java - Programmation

Marsh Posté le 10-01-2005 à 11:09:17    

Bonjour à tous,
 
J'ai besoin de convertir un int en byte[4] puis de reconvertir ce byte[4] en int.
Voila ce que je fais pour int => byte[4] : Qu'en pensez vous ?

Code :
  1. byte[] baTailleInt = new byte[4];
  2.     for( i=0; i<4; i++ )
  3.     {
  4.          baTailleInt[i] = (byte) (iMonInt>>(i*8));
  5.     }


Par contre, je ne sais pas comment faire pour faire le chemin inverse byte[4] => int ... si vous aviez une idée ...
 
merci d'avance,
Rafax

Reply

Marsh Posté le 10-01-2005 à 11:09:17   

Reply

Marsh Posté le 10-01-2005 à 11:34:51    

Je fait pas de java mais voila ce que ça donnerai en C
 
int a=0;
char b[4] = ... ;
for(int i=0; i<4; i++)
{
 a |= b[i]<<((3-i)*8);
}
 
ou encore
a = b[3]<<24 | b[2]<<16 | b[1]<<8 | b[0];


Message édité par spokup le 10-01-2005 à 11:49:53
Reply

Marsh Posté le 10-01-2005 à 11:53:50    

ok, merci beaucoup spokup, j'essaie de suite.

Reply

Marsh Posté le 10-01-2005 à 15:47:10    

Bon alors voilà :
Pour décomposer un int en tableau de 4 bytes :

Code :
  1. int i0 = new Integer((iArgs>>>24)).intValue();
  2. int i1 = new Integer(((iArgs<<8)>>>24)).intValue();
  3. int i2 = new Integer(((iArgs<<16)>>>24)).intValue();
  4. int i3 = new Integer(((iArgs<<24)>>>24)).intValue();


 
Pour recomposer l'int :  

Code :
  1. baTailleBlob[0]<<24 | baTailleBlob[1]<<16 | baTailleBlob[2]<<8 | baTailleBlob[3]


 
Dans la premiere partie, j'ai volontairement laissé des int ... alors que j'ai besoin d'avoir des bytes.
Le problème est qu'un byte est codé entre -128 et +127.
donc si un de mes 4 bytes de mon int est > 127 ... je passe en négatif et je ne sais pas comment faire.
Il semblerait qu'en ajoutant bit à bit (2e code), le signe devrait se retrouver sur le bit de poids fort du 1er byte [0], mais il n'en ait rien.
voilà le code complet que j'utilise pour tester cette partie... Si qqu'un se sent de taille de me donner un coup de main ...

Code :
  1. public static void main(String[] args)
  2. {
  3.  try
  4.  {
  5.   int iArgs = new Integer(args[0]).intValue();
  6.         byte[] baTailleBlob = new byte[4];
  7.         System.out.println("iArgs = " + iArgs);
  8.         int i0 = new Integer((iArgs>>>24)).intValue();
  9.         int i1 = new Integer(((iArgs<<8)>>>24)).intValue();
  10.         int i2 = new Integer(((iArgs<<16)>>>24)).intValue();
  11.         int i3 = new Integer(((iArgs<<24)>>>24)).intValue();
  12.         System.out.println("i0 =" + i0);
  13.         System.out.println("i1 =" + i1);
  14.         System.out.println("i2 =" + i2);
  15.         System.out.println("i3 =" + i3);
  16.         baTailleBlob[0] = new Byte(""+i0).byteValue();
  17.         System.out.println("baTailleBLob[0] =" + baTailleBlob[0]);
  18.         baTailleBlob[1] = (byte)i1;
  19.         System.out.println("baTailleBLob[1] =" + baTailleBlob[1]);
  20.         baTailleBlob[2] = (byte)i2;
  21.         System.out.println("baTailleBLob[2] =" + baTailleBlob[2]);
  22.         baTailleBlob[3] = (byte)i3;
  23.         System.out.println("baTailleBLob[3] =" + baTailleBlob[3]);
  24.        
  25.         int iUnCompressedSize = baTailleBlob[0]<<24 | baTailleBlob[1]<<16 | baTailleBlob[2]<<8 | baTailleBlob[3];
  26.             System.out.println("iUnCompressedSize :" + iUnCompressedSize);
  27.  }
  28.  catch (Throwable e)
  29.  {
  30.   System.out.println("Erreur !" );
  31.             e.printStackTrace();
  32.  }
  33.  System.exit(0);
  34. }


Donc, en fait, tant qu'on passe en args[0] un entier dont aucun des 4 bytes ne dépasse 127 ... tout va bien ... sinon, c'est pas cool !
merci de votre aide.
 
Rafax

Reply

Marsh Posté le 10-01-2005 à 15:52:06    

https://opensvn.csie.org/traccgi/lu [...] ction.java
 
tout en bas, les 2 dernieres methodes statiques

Reply

Marsh Posté le 10-01-2005 à 16:17:29    

Les unions ca n'existe pas en Java ?
 
union {
     unsigned char b[4] ;
     int a ;
}
 
Il faut faire attention à l'architecture, mais c'est l'idée.

Reply

Marsh Posté le 10-01-2005 à 16:20:23    

C'est exactement ce que je voulais.
 
En fait, on code bien sur 4 bytes (4x1octet)
C'est mon décodage qui n'était pas bon...
 
Merci encore,
 
Rafax

Reply

Marsh Posté le 10-01-2005 à 16:57:51    

Au fait, merci Lorill !  :)

Reply

Sujets relatifs:

Leave a Replay

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