Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : cohabitation java/cpp [ Archives / Maths & Algorithmes ] (misterzinzin)

lundi 14 novembre 2005 à 23:51:34 | cohabitation java/cpp

misterzinzin

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

mardi 15 novembre 2005 à 00:30:18 | Re : cohabitation java/cpp

Dobel

Réponse acceptée !
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]

mardi 15 novembre 2005 à 00:35:48 | Re : cohabitation java/cpp

bastet1978

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.<br>
* 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).<br>
* <br>
* <b>Example:</b><br>
* <code>intToByteArray(258)</code> will return { 0, 0, 1, 2 },<br>
* <code>BigInteger.valueOf(258).toByteArray()</code> 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)
----

mardi 15 novembre 2005 à 01:27:40 | Re : cohabitation java/cpp

Dobel

Réponse acceptée !
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]

mardi 15 novembre 2005 à 18:37:33 | Re : cohabitation java/cpp

misterzinzin

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



Cette discussion est classé dans : int, byte, retour, conv, desbyte


Répondre à ce message

Sujets en rapport avec ce message

CONVERTIR UN BYTE EN 8 BOOLEAN [ par Egalon ] Bonjour à tous,voilà, mon problème est dans le titre, c'est très simple mais ca marche pas....par ex: un int = 170, en base 2, c Sérialisation [ par saispasq ] salut à tou, je veu savoir comen sérialiser des paramétres dans une méthode Java; exple: une methode drawsolidline(int , int , byte [][], EGraphics, probleme de conversion d'un tableau byte[] en BufferedImage [ par ouassit ] bonjour bon je vais expliquer mon probleme ; je veux envoyer un objet de type BufferedImage en resaue utlisant une connexnio UDP ; j'ai pu convertir m Convertir un String en Byte [ par theneo55 ] Bonjour à tous,dans le projet que j'effectue je dois convertir un string (ex : 7e000100000107f) en un objet byte, sachant que 7e en byte devrait donne conversion un tableau de byte en int [ par dunith ] bonjour;j'ai mis dans mon code:void decodeSeq(int[] buffer, TCmdQueue FileAttente, int iCodeSeq) {  int iNdexParam =0;  //correspond aux séquences(lig Mixer des WAV entre eux (superposer) [ par choukroute ] Bonjour, je cherche à additionner plusieurs sons de type wav entre eux, afin d'en créer un seul...J'ai réussi à extraire les valeurs des échantillons, ENVOIE PAQUET TCP (demande de connexion) [ par midoo86 ] Bonjour, j'essaie d'établir une demande de connexion avec une machine qui contient un sniffer sur réseau local mais j'ai pas reçu de réponse (la captu convertir byte2int et int2byte [ par misterzinzin ] j'ai programmé un serveur c++ qui communique avec un client c++... je voudrais maintenant programmer un client java sans toucher au serveur c++ mais Jinternal Frame [ par Zart ] Salut, J'ai un ti soucis avec mes internalFrames ! J'aimerais pouvoir les ajouter et que les nouvelles se mettent au premier plan. Je fais tout simpl Vector -> int --> Integer ??? [ par les french texans ] Bonjour, Je suis en train de faire un projet et je souhaite utiliser un vecteur. Pour cela je le déclare puis l'instancie. Mais quand je veux introdu


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 2,839 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.