IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Question endianness Java/C++ embarqué


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 75
    Points : 59
    Points
    59
    Par défaut Question endianness Java/C++ embarqué
    bonjour à tous,

    je developpe une serveur Java qui doit dialoguer avec
    une client codé en C++ embarqué sur une carte.
    J'utilise UDP pour envoyer des paquets.

    Je me demande si je vais avoir des problèmes d'endianness.
    En effet, le serveur sera sur un PC (x86) donc little-endian
    et le client embarqué sur une carte donc big-endian.

    Or, j'ai vu que la machine virtuelle Java fonctionne en big-endian.
    Pourtant, j'ai déjà réussi à dialoguer sans problème avec le client
    qui tourne encore sur un PC (x86) pour l'instant.

    Voici mes questions :

    1) Comment se fait-il que j'ai réussi à faire communiquer
    mon serveur java avec le client alors que la JVM est en big-endian
    et que le client codé en C++, encore sur un PC, était en little-endian ?


    2) Voici un exemple d'envoie de paquet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DatagramSocket socket = new DatagramSocket(2000);
    byte[] buf = new byte[1024];
     
    //Je veux envoyer : 0x0B110100
    buf[0]=0x00;
    buf[1]=0x01;
    buf[2]=0x11;
    buf[3]=0x0B;
     
    DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName(IP_ADDRESS), PORT);
    socket.send(packet);
    Comme vous pouvez le voir, j'envoie en little-endian.

    La JVM va t-elle convertir mon paquet automatiquement en big-endian ?

    3) Je voudrais que le serveur, en fonction du choix de l'utilisateur,
    envoie les paquets soit en big, soit en little.
    Mais je voudrais éviter de coder un truc lourd avec des "if" partout genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    DatagramSocket socket = new DatagramSocket(2000);
    byte[] buf = new byte[1024];
     
    if(endian == little)
    {
    	//Je veux envoyer : 0x0B110100
    	buf[0]=0x00;
    	buf[1]=0x01;
    	buf[2]=0x11;
    	buf[3]=0x0B;
    }
    else if(endian == big)
    {
    	//J'inverse les indices
    	buf[3]=0x00;
    	buf[2]=0x01;
    	buf[1]=0x11;
    	buf[0]=0x0B;
    }
     
    DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName(IP_ADDRESS), PORT);
    socket.send(packet);
    Comment feriez-vous pour coder ça proprement ? Faut-il utiliser un design pattern ?

    Merci.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Je regarderais du cote du package java.nio

    Tu as notamment la classe ByteBuffer, qui te permet de gerer l'endianess (cf ByteBuffer.order()).

  3. #3
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    ok merci je regarderai.

    mais pour mes 2 premières questions vous avez une idée ?

    merci.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Pour les sockets TCP/IP, les données sont transférées par convention en big endian.

    Pour les sockets UDP, j'imagine que ca doit être la même chose.

    A priori, ce sont les couches systemes qui vont faire la conversion pour emettre et recevoir les données dans le bon endianess.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    Pour les sockets TCP/IP, les données sont transférées par convention en big endian.

    Pour les sockets UDP, j'imagine que ca doit être la même chose.
    Est-ce que ceci est propre à Java ou est-ce c'est la même chose en C++ ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    J'ai relu ma réponse. J'avoue que je me suis reposé pas mal de questions. J'étais sur d'avoir lu que les systemes communiquaient en bigendian, mais je ne comprenais pas le lien avec l'API d'une socket.

    J'ai fait quelques recherches sur internet, et voici ce que j'en ai compris.

    Quand on parle d'endianess, on peut parler de bit-endianess ou byte-endianess.
    Le bit-endianess, c'est la position de bit de poids fort dans l'octet.
    Le byte-endianess, c'est la position de l'octet de poids fort dans un mot.

    Quand deux systemes communiquent, il faut qu'ils aient le meme bit-endianess. Pour les sockets UPD, a priori, c'est donc en big endian. La conversion est faite par les drivers de l'OS ou le hardware.

    Quand on est sur un systeme, on ne s'occupe pas en general du bit-endianess (on est en big endian). Par contre le byte-endianess est toujours a gerer.

    Ce qui veut dire qu'a priori, si tu veux envoyer un mot, qui doit être compris du client, il faut que client et serveur se mettent d'accord sur l'endianess.
    Si tu envoies que des octets (typiquement des caracteres ascii), tu ne seras pas gêné.

    Que ce soit java, C++, il n'y a pas de transformation automatique des buffers recus.

  7. #7
    Membre habitué Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Points : 185
    Points
    185
    Par défaut
    En C++ tu as les fonctions htonl (host to network long) ntohl (network to host long) htons (host to network long) et ntohs (network to host long) qui te permettent de recuperer ou d'envoyer des long et des short sur le reseau dans le bon endianness.

    Java est en big-endian, tout comme les interfaces reseaux. Donc envoie tes données Java sans changer l'endianness puis utilise les fonctions C++ pour recuperer tes données sans te soucier de l'endianness sur la machine C++ (si ta machine C++ est dans le meme endianness que les interfaces reseaux, ces fonctions ne font rien )

  8. #8
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    Ok merci pour vos réponses

    a+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. aide question C++, java
    Par vincent_roye dans le forum C++
    Réponses: 2
    Dernier message: 15/06/2007, 17h29
  2. questions relatives à java<=>PDF
    Par subzero82 dans le forum Documents
    Réponses: 24
    Dernier message: 08/05/2007, 15h44
  3. Question RMI java
    Par denebj dans le forum API standards et tierces
    Réponses: 15
    Dernier message: 27/02/2007, 09h15
  4. [Java] Question sur Java et les états.
    Par Cassios dans le forum Autres outils décisionnels
    Réponses: 6
    Dernier message: 19/02/2007, 17h37
  5. [JAVA]programmation embarqué
    Par lamorosso dans le forum Java ME
    Réponses: 4
    Dernier message: 12/01/2006, 12h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo