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 :

convertir un long en string


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut convertir un long en string
    bonjour,

    J'ai une variable de type Long qui contient une adresse MAC (nombre compris entre 0x000000000000 et 0xFFFFFFFFFFFF)

    Comment faire pour convertir ce nombre en une chaine de caractère de cette forme : xx : xx : xx : xx : xx : xx
    => xx représente la décomposition en valeurs hexadécimales de l'adresse MAC

    ex:
    Si ma variable vaut 0x010203040506
    => je veux avoir la chaine de caractère "01:02:03:04:05:06"


    aussi, lorsque je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Long val = Long.parseLong(varStr, 16); // convertion en nombre
    => si la chaine n'est pas un nombre ça me génère une erreur : comment faire pour éviter ceci ?


    merci d'avance

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par boboss123 Voir le message

    Comment faire pour convertir ce nombre en une chaine de caractère de cette forme : xx : xx : xx : xx : xx : xx
    A la main, tu décompose en bytes ton long et tu affiche chaque byte séparément en hexadécimal
    aussi, lorsque je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Long val = Long.parseLong(varStr, 16); // convertion en nombre
    => si la chaine n'est pas un nombre ça me génère une erreur : comment faire pour éviter ceci ?
    Si tu veux dire "comment parser une adresse mac", encore un fois c'est à la main. Tu splitte autour des ":" ta chaine, et pour chaque élément du split, tu fait passer dans Integer.parseInt(element,16) pour faire du parsing en hexadécimal.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    ok merci, je pensais qu'il y avait des fonctions toutes faite pour ça

    Pour parser un long en byte[], on fait comment (la classe Byte ne sait parser que des String) ?


    aussi, lorsque je fais ça :
    Code :

    Long val = Long.parseLong(varStr, 16); // convertion en nombre

    => si la chaine n'est pas un nombre ça me génère une erreur : comment faire pour éviter ceci ?
    Si tu veux dire "comment parser une adresse mac", encore un fois c'est à la main. Tu splitte autour des ":" ta chaine, et pour chaque élément du split, tu fait passer dans Integer.parseInt(element,16) pour faire du parsing en hexadécimal.
    non, ce que je voudrais faire c'est tester si element peut etre parser en int avant d'utiliser la focntion (pour eviter d'avoir une erreur)

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par boboss123 Voir le message
    Pour parser un long en byte[], on fait comment (la classe Byte ne sait parser que des String) ?
    pas parser, convertir. Suffit d'extraire les bits qui t'intéressent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    byte0 = addresseLong & 0XFF;
    byte1 = addresseLong & 0XFF00 >> 8;
    byte2 = addresseLong & 0XFF0000 >> 16;
    Etc...

    non, ce que je voudrais faire c'est tester si element peut etre parser en int avant d'utiliser la focntion (pour eviter d'avoir une erreur)
    Avec un expression régulière, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    adressesString.matches("^\\s*(\\p{XDigit}\\p{XDigit}:){5}\\p{XDigit}\\p{XDigit}\\s*$");

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    Ok, merci beaucoup

    Citation Envoyé par tchize_ Voir le message
    pas parser, convertir. Suffit d'extraire les bits qui t'intéressent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    byte0 = addresseLong & 0XFF;
    byte1 = addresseLong & 0XFF00 >> 8;
    byte2 = addresseLong & 0XFF0000 >> 16;
    => c'est super lourd tous ces décalages et ces masques, y a pas plus simple ? En langage C ça aurait donné juste ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char myByte[4];
    long myVal = 0x123456; // (taille 8 bytes en C)
    myByte[0] = ((char*)&myVal )[0];
    myByte[1] = ((char*)&myVal )[1];
    myByte[2] = ((char*)&myVal )[2];
    myByte[3] = ((char*)&myVal )[3];
     
     
    // ou encore
    *((long*)myByte) = myVal;

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    non, d'abord ton code C est faux, un long ne fait pas nécessairement 8 byte en C, sa taille minimum est de 32bits, mais ca peut varier suivant l'architecture et le compilateur utilisé. C

    Ensuite, plus grave, ton code présuppose que les bytes au sein d'un long sont dans une endiance précise, ce qui n'est pas garantit suivant l'architecture utilisée. Dans ton cas, si j'exécute ton code sur x86, j'obtiens "56 34 12", sur HP-UX/PA-RISC j'obtiens "0 12 34". A contrario, un code avec des masque donne la garantie que c'est toujours le meme résultat.


    Finalement, ce code détourne l'arithmétique sur les pointeur, il n'y a pas de pointeur en java.

    Si tu veux faire "plus court", t'as ce code ci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    byte[] b = new byte[8];
    long val = ....;
    for (int i = 0; i< 8; i++)
       b[i]=val&(0xFF<<(i*8))>>i*8
    mais c'est moins lisible et moins performant.

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    En fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    byte[] b = new byte[8];
    long val = ....;
    for (int i = 0; i< 8; i++)
       b[i]= (byte)(val >> i*8);
    Est suffisant. Un byte ne contient que 8 bits de toutes façon. Pas besoin de masque, le cast n'a pas vraiment le choix.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    J'arrive un peu tard sur le sujet... mais il s'agit de simple conversion et il me semble que vous vous compliquer un peu la vie.

    Depuis Java 5 on dispose de la méthode String.format() qui permet de formater des chaines "à la printf" ce qui est très pratique également pour formater un nombre en une base quelconque.

    Cela permet en particulier de définir une longueur minimum pour la valeur, en rajoutant automatiquement les zéro inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    long number = 0x010203040506L;
     
    // Convertion number -> text
    String text = String.format("%012X", number); // renvoi : "010203040506"
    Ensuite il suffit de rajouter les ":" tous les 2 caractères, ce qui nous donne via une expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    long number = 0x010203040506L;
     
    // Convertion number -> text
    String text = String.format("%012X", number)
    	.replaceAll("(..)(?!$)", "$1:"); // renvoi "01:02:03:04:05:06"

    Enfin, pour la conversion inverse ("01:02:03:04:05:06" vers un long), il suffit de "supprimer" les ":" afin de pouvoir parser la valeur tout à fait normalement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Conversion text -> number
    number = Long.parseLong( text.replace(":", ""), 16 );
    Et on ne s'embête pas avec des décalages de bits

    Citation Envoyé par boboss123 Voir le message
    non, ce que je voudrais faire c'est tester si element peut etre parser en int avant d'utiliser la focntion (pour eviter d'avoir une erreur)
    Attention à ceci car c'est bien souvent un mauvais choix car cela revient à doubler les traitements. La meilleur façon de s'assurer que parseLong() ne génère pas d'erreur serait d'appeler parseLong()

    Toutes les autres solutions ne sont pas forcément sûr (en particulier à causes des plages de valeurs possibles) et ne font que rajouter du code inutile dans 95% des cas.

    Il est nettement plus simple de traiter l'erreur lorsqu'elle surgit plutôt que de tenter de la repérer en amont...


    a++

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

Discussions similaires

  1. convertir un long en string
    Par schwinny dans le forum VBA Access
    Réponses: 2
    Dernier message: 04/03/2008, 08h41
  2. Comment convertir un TChartTitle en string ?
    Par marsupilami34 dans le forum Langage
    Réponses: 4
    Dernier message: 25/07/2005, 14h14
  3. Réponses: 14
    Dernier message: 29/06/2005, 10h22
  4. [C#] Convertir des bytes en string
    Par sorcer1 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 03/02/2005, 15h52
  5. Convertir un entier long en string
    Par aroueche dans le forum C
    Réponses: 5
    Dernier message: 12/07/2004, 13h48

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