Cohabitation java/cpp

Résolu
misterzinzin Messages postés 112 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 26 janvier 2011 - 14 nov. 2005 à 23:51
misterzinzin Messages postés 112 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 26 janvier 2011 - 15 nov. 2005 à 18:37
bonjour, j'ai développé un serveur en c++ sous linux qui est interrogé
par des serveur c++... tout marche bien... mon probleme se situe coté
client en java...

en fait tout fonctionne bien... sauf que:

losque le serveur envois un "int" sur le réseau, il envois 4 byte (sizeof(int))

mes 4 byte sont récupéré coté java dans un byte[] qui fait 4 byte.

le probleme est le suivant: comment convertir un byte[] en int

et comment convertir un int en byte[]... pour que ca marche a tout les coup?



public int byte2int(byte[] desbyte)

{

return desbyte[0]+desbyte[1]*256+desbyte[2]*256*256+desbyte[3]*256*256*256;

}

marche tres bien mais pas pour le chiffre 1000... qui est codé 00 00 03 E8

et donc desbyte[0]=E8 qui correspond a -24 donc ca foire...



pour l'autre sens j'ai deja fait ceci qui apparement fonctionne:

public byte[] int2byte(int valeur)

{

byte[] retour=new byte[4];

Integer conv=new Integer(valeur%256);

retour[0]=conv.byteValue();

conv=new Integer((valeur%(256*256))/256);

retour[1]=conv.byteValue();

conv=new Integer((valeur%(256*256*256))/(256*256));

retour[2]=conv.byteValue();

conv=new Integer(valeur/(256*256*256));

retour[3]=conv.byteValue();

return retour;

}



donc pour la deuxiemme si vous avez plus simple, je suis preneur...

pour la premier... je me contenterais d'un truc qui marche... car la je sature.

moi, le seul, l'unique, ZinZin

4 réponses

cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
15 nov. 2005 à 00:30
Plus rapidement :



int i = 0x1a2b3c4d;



//décomposition

byte b4 = (byte) (i & 0xff);

i = i>>8;

byte b3 = (byte) (i & 0xff);

i = i>>8;

byte b2 = (byte) (i & 0xff);

i = i>>8;

byte b1 = (byte) (i & 0xff);



//recomposition

int j = (b1 <<24) | (b2<<16) & 0xff0000 | (b3<<8) & 0xff00 | b4 & 0xff;


ensuite, ce n'est pas parce que pour E8, il dit -24 que la conversion est fausse !!

byte est signé en Java !

donc (byte) E8 = -24 en java :)



dans la dernière ligne, les &0xff servent justement à éviter un problème de cast lié à ça :

si je fais simplement

int j = (b1 <<24) | (b2<<16) | (b3<<8) | b4;

alors si par hasard b4 E8 -24 :)

il fait un cast en (int) pour le '+', qui donne :

(int) b4 FFFFFFE8 -24 en int --> et notre recomposition est fausse :)

on veut plutôt 000000E8 en int :)



A+

Dobel
[Une fois rien, c'est rien; deux fois rien, ce
n'est pas beaucoup, mais pour trois fois rien, on peut déjà s'acheter
quelque chose, et pour pas cher]
3
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
15 nov. 2005 à 01:27
Dans le code que j'ai mis, pour la décomposition, les & 0xff sont
inutiles, puisque le cast d'un int en byte en java revient à
prendre les 8 bits de poids faible :)


donc simplement :

byte b4 = (byte) i;

i = i>>8;

byte b3 = (byte) i;

i = i>>8;

byte b2 = (byte) i;

i = i>>8;

byte b1 = (byte) i;




Dobel
[Une fois rien,
c'est rien; deux fois rien, ce n'est pas beaucoup, mais pour trois fois
rien, on peut déjà s'acheter quelque chose, et pour pas cher]
3
bastet1978 Messages postés 54 Date d'inscription lundi 29 septembre 2003 Statut Membre Dernière intervention 4 décembre 2005
15 nov. 2005 à 00:35
Salut, je ne suis pas un pro du byte mais j'ai des bouts de codes si ça peut t'aider:





int = > byte

**
* Returns a byte array containing the two's-complement representation of the integer.

* The byte array will be in big-endian byte-order with a fixes length of 4
* (the least significant byte is in the 4th element).

*

* Example:

*
intToByteArray(258)
will return { 0, 0, 1, 2 },

*
BigInteger.valueOf(258).toByteArray()
returns { 1, 2 }.
* @param integer The integer to be converted.
* @return The byte array of length 4.
*/
private byte[] intToByteArray (final int integer) {
int byteNum = (40 - Integer.numberOfLeadingZeros (integer < 0 ? ~integer : integer)) / 8;
byte[] byteArray = new byte[4];

for (int n = 0; n < byteNum; n++)
byteArray[3 - n] = ( byte ) (integer >>> (n * 8));

return (byteArray);
}




byte => int

byte[] myByteArray = { ( byte )23, (byte)34, (byte)45 };

int[] myIntArray = new int[myByteArray.length];
for (int i = 0; i < myByteArray.length; ++i) {
myIntArray[i] = myByteArray[i];
}



----
OS: Ubuntu 5.10(linux)
jdk : 1.5.0
MysqlConnector/J: 3.2
mysql Ver 12.22 Distrib 4.0.24, for pc-linux-gnu (i486)
----
0
misterzinzin Messages postés 112 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 26 janvier 2011 2
15 nov. 2005 à 18:37
merci dobel, effectivement ton code marche (je n'avais pas pensé au shift et masque)

sauf que moi mon byte[0] correspond a ton b4... je les envois dans l'autre ordre



donc en résumé pour celui qui passe par la:



public int byte2int(byte[] desbyte)

{

return

(desbyte[3]<<24)|(desbyte[2]<<16)&0xFF0000|(desbyte[1]<<8)&0xFF00|desbyte[0]&0xFF;

}



public byte[] int2byte(int valeur)

{

byte[] retour=new byte[4];

retour[0] = (byte) valeur;

valeur = valeur>>8;

retour[1] = (byte) valeur;

valeur = valeur>>8;

retour[2] = (byte) valeur;

valeur = valeur>>8;

retour[3] = (byte) valeur;

return retour;

}

moi, le seul, l'unique, ZinZin
0
Rejoignez-nous