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

Java Discussion :

[Debutant(e)]conversion int to byte[] et inversement


Sujet :

Java

  1. #1
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 16
    Par défaut [Debutant(e)]conversion int to byte[] et inversement
    Bonjour je suis debutant en java et j aimerai avoir quelque renseignements.
    Je fais une application UDP avec client et serveur et j aimerai inscrire dans le paquet que je transmet un int (plus grand que 255 mais de taille fixe tout de meme qui tiendra sur un tableau de deux bytes). Pour cela il faut que je le convertisse en byte[] pour pouvoir le transmettre. Y a t il une methode simple pour convertir un int en byte[]?
    Inversement de l autre cote de la transmission j aimerai pouvoir recuperer cet entier afin de pouvoir faire des traitements par la suite, il me faut donc un convertisseur byte[] to int.
    Excusez moi pour les accents mais j ai un clavier americain.
    Merci



    [Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java

  2. #2
    NGY
    NGY est déconnecté
    Membre expérimenté
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Par défaut
    Je ne suis pas sûr de comprendre.

    Mais en tout cas, il n'existe pas de méthode toute faite pour convertir un int en byte[] et ça parait plutôt normal (Il n'y a pas règle de conversion évidente).
    Tout ce que tu peux faire c'est convertir un int en byte

    Par contre, tu peux écrire facilement la méthode toi-même.
    Quelle est la règle de conversion que tu veux appliquer ?

  3. #3
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 16
    Par défaut
    En fait mon entier au depart est 35160 si je le convertit en byte la valeur sera tronque puisque un byte ne fait que 8 bits et qu il en faut plus pour ecrire 35160.
    Par contre il peut s ecrire sur 2 bytes, en fait je veux simplement une methode qui me permette de convertir cet int en un tableau de byte de longueur 2.
    Quant aux regles de conversion je ne comprends pas ce que tu veux dire, si c est little Endian ou Big Endian, peut m importe tant que j ai une autre methode de l autre cote de la transmission me permettant de faire la conversion inverse(byte[] en int).
    Je fais tout ca parcequ' a moins que je ne m abuse on ne peut transmettre que des byte[] avec la classe DatagramPacket. Des methodes existe pour convertir un String en byte[] mais c est pas ce que je veux...
    J espere avoir ete plus clair.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    Tous les types primitifs peuvent etre transformaer facilement en String... Cela parait evident, donc j'imagine que tu y a deja pansé mais on ne sais jamais...

  5. #5
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 16
    Par défaut
    C est effectivement une solution probable, et non je n y avais pas penser je vais investiguer cela, je vous donne des nouvelles...

  6. #6
    NGY
    NGY est déconnecté
    Membre expérimenté
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Par défaut
    Pour la règle de conversion, je ne savais pas si tu voulais convertir ton int en String puis en tableau de byte, comme l'a dit TabrisLeFol ou bien si tu voulais le découper en n X 1 octet.

    Donc si je comprends bien, tu entier est toujours inférieur à FFFF et tu veux le mettre dans un tableau de 2 bytes.
    Dans ce cas, tu peux une méthode à base de masques du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tonTableau[0] = tonEntier & 0x00FF
    tonTableau[1] = tonEntier & 0xFF00

  7. #7
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 16
    Par défaut
    Bon alors j ai fait un truc ca ne marche pas :

    cote envoi :
    String tmp = Integer.toOctalString(5555);
    byte[] byteTmp2=stringToSend.getBytes();
    bufferToSend[1]=byteTmp2[0];
    bufferToSend[2]=byteTmp2[1];

    cote reception :

    byte[] b1 = new byte[2];
    b1[0]= buf[1];
    b1[1]= buf[2];
    answerPort = Integer.parseInt(new String(b1));
    System.out.println("Answer port = " + answerPort);


    et il me sort les exceptions :
    at java.lang.NumberFormatException.forInputString(Unknown Source)

    Quelqu un a une idee?

  8. #8
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 16
    Par défaut
    ok merci NGY peux tu me donner la conversion inverse stp? J avoue n avoir jamais rien compris a ces histoires de masque

  9. #9
    NGY
    NGY est déconnecté
    Membre expérimenté
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Par défaut
    Je reprends ton exemple :
    En fait mon entier au depart est 35160 si je le convertit en byte la valeur sera tronque puisque un byte ne fait que 8 bits et qu il en faut plus pour ecrire 35160.
    Par contre il peut s ecrire sur 2 bytes, en fait je veux simplement une methode qui me permette de convertir cet int en un tableau de byte de longueur 2.
    35160 en hexa ça fait 8958. Donc ton but est bien de mettre 89 dans la case 0 du tableau et 58 dans la case 1 ?

    Je te propose de faire ça à l'aide de masques :
    Pour récupérer le 89, tu fais un masque avec & FF00, et pour le 58, avec & 00FF.

    Comment ça marche ? Simple, il suffit de tout mettre en binaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        8    9    5    8  (hexa) 
    = 1000 1001 0101 1000 (binaire)
    Maintenant tu fais un & (l'opérateur ET binaire) sur 00FF, soit en binaire 0000000011111111, ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       1000 1001 0101 1000 = 8958
     & 0000 0000 1111 1111 = 00FF
     = 0000 0000 0101 1000 = 0058 =88 (decimal), mais on s'en fout
    Pareil pour le masque avec FF00 (essaie, tu verras, ça donne bien 89).

    Pour la conversion dans l'autre sens, ben c'est pas dur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tonEntier = tonTab[1]*256 + tonTab[0];
    Si tu comprends pas un truc, fais-moi signe.

  10. #10
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Citation Envoyé par NGY
    Pour la règle de conversion, je ne savais pas si tu voulais convertir ton int en String puis en tableau de byte, comme l'a dit TabrisLeFol ou bien si tu voulais le découper en n X 1 octet.

    Donc si je comprends bien, tu entier est toujours inférieur à FFFF et tu veux le mettre dans un tableau de 2 bytes.
    Dans ce cas, tu peux une méthode à base de masques du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tonTableau[0] = tonEntier & 0x00FF
    tonTableau[1] = tonEntier & 0xFF00
    NGY n'oublie l'opération de décalage vers la droite

    En plus un int (-2^31 à 2^31-1) en java est codé sur 4 bytes

  11. #11
    NGY
    NGY est déconnecté
    Membre expérimenté
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Par défaut
    NGY n'oublie l'opération de décalage vers la droite
    Trop tard ! Je l'ai oublié !

    En plus un int (-2^31 à 2^31-1) en java est codé sur 4 bytes
    Ben oui, mais il a dit que son entier pouvait toujours tenir dans un tableau de 2 octets, donc j'ai supposé que 0 < l'entier < 65535.

  12. #12
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Citation Envoyé par "NGY

    [quote
    En plus un int (-2^31 à 2^31-1) en java est codé sur 4 bytes
    Ben oui, mais il a dit que son entier pouvait toujours tenir dans un tableau de 2 octets, donc j'ai supposé que 0 < l'entier < 65535.[/quote]

    Ok, ça m'apprendra à mieux lire...

  13. #13
    Expert confirmé


    Profil pro
    Inscrit en
    Mai 2003
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 3 240
    Par défaut Re: conversion int to byte[] et inversement
    Citation Envoyé par mune
    j aimerai inscrire dans le paquet que je transmet un int (plus grand que 255 mais de taille fixe tout de meme qui tiendra sur un tableau de deux bytes)
    Si cela tient sur 2 bytes, pourquoi ne pas utiliser un short au lieu d'un int ?
    ou même un char, si jamais négatif.

  14. #14
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 16
    Par défaut
    Salut desole de vs embeter encore une fois mais ca marche pas mais on est pas loin du compte
    Je fais ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    bufferToSend[1]=(byte) 35160 & 0x00FF;
    System.out.println("bufferToSend[1] = " + bufferToSend[1]);
    bufferToSend[2]=(byte) (35160 & 0xFF00) ;
    System.out.println("bufferToSend[2] = " + bufferToSend[2]);
    monEntier= bufferToSend[1]*256 + bufferToSend[2];
    System.out.println("mon entier =  " +monEntier);
    et le resultat est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bufferToSend[1] = 88
    bufferToSend[2] = 0
    mon entier = 22528
    Donc on s approche c est toujours mieux qu une exception mais c est pas totalement juste.
    Quelqu un a une idee pourquoi?
    Cela ne vient il pas du fait que les int et byte sont des entiers signes?
    Que dois je alors faire?

  15. #15
    NGY
    NGY est déconnecté
    Membre expérimenté
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Par défaut
    mune : Et alors, toi aussi tu a oublié :
    Citation Envoyé par jowo
    NGY n'oublie l'opération de décalage vers la droite
    Ben oui, je t'avais dis de refaire pour le masque avec FF00 ! Je me demande si t'as compris ce que je t'ai expliqué ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       1000 1001 0101 1000 = 8958
     & 1111 1111 0000 0000 = FF00
     = 1000 1001 0000 0000 = 8900 , mais on veut 89 !!!
    Donc il faut décaler tous les bits de 8 crans sur la droite, d'où :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bufferToSend[2]=(byte) ( (35160 & 0xFF00) >> 8 );
                                              ^^ décalage de 8 sur la droite
    Sinon, question : pour tu as un tableau de bytes[3] ? Un byte[2] suffirait non ?

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    Et oui faut pas oublier le 0 non plus !!!
    0 c'est pas beaucoup mais ca fait 1 lol

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bufferToSend[[b]0[/b]] = 88 
    bufferToSend[[b]1[/b]] = 0 
    mon entier = 22528

  17. #17
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 16
    Par défaut
    Excusez moi encore une fois de faire le debile mais ca marche toujours pas. Faut dire que j y comprends rien a ces histoires de masques et de decalage de bits. Les cours de systeme je les ais toujours seche et maintenant je me rends compte que c est important...
    donc mon code est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    byte[] bufferToSend = new byte[size];
    bufferToSend[0]=(byte)CMD_TYPE;
    bufferToSend[1]=(byte) 35160 & 0x00FF;
    System.out.println("bufferToSend[1] = " + bufferToSend[1]);
    //bufferToSend[2]=(byte) (35160 & 0xFF00) ;
    bufferToSend[2]=(byte) ( (35160 & 0xFF00) >> 8 ); 
    System.out.println("bufferToSend[2] = " + bufferToSend[2]);
    int monEntier=bufferToSend[1]*256+bufferToSend[2];
    System.out.println("monEntier  = " + monEntier);
    et ca donne ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bufferToSend[1] = 88
    bufferToSend[2] = 0
    monEntier  = 22528
    Desole d abuser de votre gentillesse. Pouvez vous m aider encore une fois (surement la derniere)

    Pour ta question sur la taille de mon tableau c est juste que j inscris comme tu peux le voir quelquechose avant et des choses apres aussi.

  18. #18
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    euh, en exécutant ton code, voilà ce que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bufferToSend[1] = 88
    bufferToSend[2] = -119
    monEntier  = 22409
    Mystère :

  19. #19
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 16
    Par défaut
    Ah oui effectivement je me suis trompe c'etait une vieille console. Enfin toujours est il que ca ne me donne pas le resultat escompte (35160)
    Pardon

  20. #20
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Forcément les bytes sont signés, de -128 à +127 et non de 0 à 255.

Discussions similaires

  1. Conversion de Int en byte[] et inversement
    Par arkham55 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 21/11/2011, 21h43
  2. Conversion int vers byte non signé
    Par grunk dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 09/06/2011, 16h24
  3. Conversion int en Byte
    Par nonolerobot77 dans le forum C++
    Réponses: 2
    Dernier message: 14/02/2008, 08h17
  4. [VB.NET] Conversion int-> bytes sur 4 octets
    Par SteelBox dans le forum Windows Forms
    Réponses: 11
    Dernier message: 09/01/2005, 22h08
  5. [C#] Conversion d'un string en byte[] et inversement
    Par david71 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/12/2004, 15h10

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