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

C# Discussion :

Codage des entiers dans socket (réception par java)


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut Codage des entiers dans socket (réception par java)
    Bonjour,

    Dans une application je dois envoyer des entiers entre une application C# (windows mobile) et une application (serveur) java.

    Le problème est que les bits semblent inversés :/

    En C# je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    byte[] tmp = BitConverter.GetBytes(3);
    io.Write(tmp, 0, tmp.Length);
    Coté java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i = dis.readInt();
    System.out.println("i="+i);
    Si j'envoie 1, alors je reçoit 16777216, ce qui fait en binaire 1000...0000
    Si j'envoie 3, alors je reçoit 50331648, ce qui fait en binaire 1100...0000
    Si j'envoie 0, alors j'ai bien 0...

    J'ai souvenir que socket.h (en C donc) fourni un moyen d'encoder les entier de manière portable. Existe il la même chose en C#/JAVA ?

    Merci

    edit : je poste dans C#, ça serait peut être mieux dans java ?!

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Existe il la même chose en C#/JAVA
    En C#, c'est dépendant de la machine
    Pour Intel x86, l'ordre des octets est "little-endian" : il faudra peut-être inverser.

    The order of bytes in the array returned by the GetBytes method overloads (as well as the order of bits in the integer returned by the DoubleToInt64Bits method and the order of hexadecimal strings returned by the ToString(Byte[]) method) depends on whether the computer architecture is little-endian or big-endian. The endianness of an architecture is indicated by the BitConverter.IsLittleEndian property, which returns true on little-endian systems and false on big-endian systems. On little-endian systems, lower-order bytes precede higher-order bytes. On big-endian system, higher-order bytes precede lower-order bytes.
    En JAVA :
    JAVA virtual machine always used big-endian

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    La façon dont sont codés les octet en mémoire, c'est pas vraiment mon problème.
    Le truc, c'est de trouver une fonction qui les mette dans l'ordre réseau, comment en C linux avec htonl.
    The htonl() function converts the unsigned integer hostlong from host byte order to network byte order.
    The ntohl() function converts the unsigned integer netlong from network byte order to host byte order.
    En java, les fonction readInt etc sont sur les socket, donc je suppose qu'elle font implicitement cette conversion. En C# par contre, BitConverter n'a pas été fait pour le réseau, donc il garde les octet dans l'ordre qu'il veut.

    Sinon mon programme C# tourne sur de l'arm, mais il me faut quelque-chose de portable.

    Des idées pour faire cette conversion (dans un sens comme dans l'autre)

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    J'ai trouvé la méthode IPAddress.HostToNetWorkOrder() qui à l'aire d'être portable. Je testerai ça lundi matin.

    edit: ça marche !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/02/2007, 10h20
  2. [TP] La position des entiers dans un tableau
    Par argon dans le forum Turbo Pascal
    Réponses: 22
    Dernier message: 21/12/2006, 11h42
  3. écrire des entiers dans un fichier
    Par seb__ dans le forum C
    Réponses: 3
    Dernier message: 15/10/2006, 18h32
  4. Stocker des entiers dans Objects de TStrings
    Par Louis Griffont dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2006, 08h56
  5. remplacer des espaces dans un champ par des zero
    Par yeep dans le forum Access
    Réponses: 4
    Dernier message: 08/10/2004, 09h41

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