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 :

Problème pour la fonction Long.parseLong


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut Problème pour la fonction Long.parseLong
    Bonjour.
    J'ai une chaine contenant la String suivante :
    maChaine = c0 5b c8 8b c0 00 00 00
    Je veux transformer ceci en un long signé ainsi que dans un long non signé.

    Je pensais utiliser la fonction Long.parseLong(maChaine, 16) pour avoir ma valeur en signé. Puis après ajouter le masque 0xFF FF FF FF FF FF FF FF pour avoir une valeur non signé. Mais ca ne marche po du tout.

    J'ai déjà une exception au moment du parseLong(maChaine, 16) du type java.lang.NumberFormatException.

    Et là je bloque, je pense que le problème provient du fait que le bit de poid fort de maChaine est à un, ce qui pousse Java a faire un complément à 2 et donc dépasser le long. Mais je ne suis pas certain que cela soit ca, et au quel cas, comment puis-je résoudre mon problème ?

  2. #2
    Membre Expert

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    A priori ça devrait fonctionner, donc montre-nous ton code pour qu'on puisse t'aider à trouver le problème...

  3. #3
    Membre chevronné
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Par défaut
    Bonjour,

    Il semblerait que ta chaine est trop grand:
    maChaine = c0 5b c8 8b c0 00 00 00


    Essais avec ceci (un 0 de moins)
    Long.parseLong( "c05bc88bc000000".trim(), 16)


    donne ceci
    INFO [2009-05-19T11:18:24.090] Test "866305798794379264"

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    Je n'ai pas plus de code que ce que j'ai mis ici, je fais juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String maChaine = "c05bc88bc0000000";
    Long l = Long.parseLonge(maChaine, 16);
    Sinon non la chaine fait la bonne taille. Elle fait 8 bytes, donc 64 bits, soit la longueur d'un long non signé. Mais ici la valeur en hexa est signée, ce qui fait que je n'ai plus que 63 bits + 1 bit de signe. De plus, elle a son bit de poid fort à 1.

    Mais j'ai l'impression si java utilise des long signé, la méthode parseLong elle se comporte comme si la chaine était non signée.

    Alors pour esquiver ce problème j'utilise la classe BigInteger, mais j'aimerais dans la mesure du possible garder des types primitif :/

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 155
    Par défaut
    si tu veux rester en long:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    static public long parseLongFromHexa(String hexa){
      if(hexa.length() >=16){
        return new BigInteger(hexa).longValue();
      }else{
        return Long.parseLong(hexa,16);
      }
    }

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 294
    Par défaut
    Bonjour,
    J'ai un petit problème avec le code de merill. Je voudrais convertir un string en long sous format hexadécimale. Voici le code que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String hexa = "ffffffffffffffff";
    if(hexa.lenght >= 16){
    long maValeur = new BigInteger(hexa).longValue();
    }
    Mais lorsque je compile j'ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "fffffff"
    Comment faire pour que la conversion supporte la forme hexa

    Merci d'avance

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 294
    Par défaut
    C'est bon j'ai trouvé la solution, il faut juste ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long maValeur = new BigInteger(hexa,16).longValue();

Discussions similaires

  1. problème pour utiliser fonction system
    Par Neolex dans le forum Réseau
    Réponses: 2
    Dernier message: 11/09/2012, 17h30
  2. débutante : problème pour path fonction créée
    Par mainak29 dans le forum Octave
    Réponses: 0
    Dernier message: 01/03/2011, 06h22
  3. Problème pour la fonction de clustering
    Par Sobas dans le forum MATLAB
    Réponses: 1
    Dernier message: 06/05/2009, 10h20
  4. Réponses: 7
    Dernier message: 10/09/2005, 16h49
  5. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30

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