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 :

Reversibilite Integer.parseInt et Integer.toHexString


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 44
    Points : 34
    Points
    34
    Par défaut Reversibilite Integer.parseInt et Integer.toHexString
    Bonjour,
    je coince sur ce probleme:
    Pourquoi lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            System.out .println( "toHexString toUpperCase: "+ Integer.toHexString(-1333).toUpperCase());
    ca me donne toHexString toUpperCase: FFFFFACB

    et lorque je fais l'inverse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
             String h = Integer.toHexString (-1333).toUpperCase();       
            System.out .println( "Integer.parseInt: "+ Integer.valueOf(h,16))
    ca me donne
    java.lang.NumberFormatException : For input string: "FFFFFACB"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48 )
    Merci de votre aide

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    C'est parceque ton nombre est négatif.

    Or, quand tu veux le retransformer en entier, il tente de le convertir en un entier positif, qui dépasse la valeur Integer.MAX_VALUE

    Si tu essayes avec Long.valueOf(h,16), tu verras que ça passe, mais que tu obtiens un très grand nombre positif.

    Si tu veux la réversibilité, il faut:
    - tester si ton nombre est négatif
    - si non, aucun problème
    - si oui, tu codes en hexa sa valeur absolue et tu ajoutes "-" en début de chaîne
    - là tu obtiendras la résersibilité de l'opération

    Voilà pour ton exemple le code réversible que tu voulais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String h = "-" + Integer.toHexString (1333).toUpperCase();				System.out.println(h);
    System.out .println( "Integer.parseInt: "+ Integer.valueOf(h,16));
    ou alors, il te faudra passer par une librairie plus poussée de manipulation hexadécimale

  3. #3
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Ou simplement utiliser Integer.toString(taChaine,0x10) plutôt que toHexString...

    Mais bon c'est vrai que la méthode inverse de toHexString aurait pû être implémentée par défaut dans l'api java... C'est un peu galère là quand il faut manipuler des nombres en binaire... Surtout avec les bytes...
    Car ça c'est vraiment le truc "de base", et l'api ne le fait pas... Mais bon... tant pis...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Citation Envoyé par CyberChouan
    C'est parceque ton nombre est négatif.

    Or, quand tu veux le retransformer en entier, il tente de le convertir en un entier positif, qui dépasse la valeur Integer.MAX_VALUE

    Si tu essayes avec Long.valueOf(h,16), tu verras que ça passe, mais que tu obtiens un très grand nombre positif.

    Si tu veux la réversibilité, il faut:
    - tester si ton nombre est négatif
    - si non, aucun problème
    - si oui, tu codes en hexa sa valeur absolue et tu ajoutes "-" en début de chaîne
    - là tu obtiendras la résersibilité de l'opération

    Voilà pour ton exemple le code réversible que tu voulais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String h = "-" + Integer.toHexString (1333).toUpperCase();				System.out.println(h);
    System.out .println( "Integer.parseInt: "+ Integer.valueOf(h,16));
    ou alors, il te faudra passer par une librairie plus poussée de manipulation hexadécimale
    Tiens ! Je n'avais jamais fait attention à ça. C'est vraiment bizarre comme comportement. Sans doute une optimisation de l'algorithme, n'empêche que ...

  5. #5
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Citation Envoyé par verbose
    Tiens ! Je n'avais jamais fait attention à ça. C'est vraiment bizarre comme comportement. Sans doute une optimisation de l'algorithme, n'empêche que ...
    C'est pourtant le comportement indiqué dans la Javadoc de la méthode parseInt() :
    Citation Envoyé par Javadoc
    Parses the string argument as a signed integer in the radix specified by the second argument. The characters in the string must all be digits of the specified radix (as determined by whether Character.digit(char, int) returns a nonnegative value), except that the first character may be an ASCII minus sign '-' ('\u002D') to indicate a negative value. The resulting integer value is returned. An exception of type NumberFormatException is thrown if any of the following situations occurs:
    • The first argument is null or is a string of length zero.
    • The radix is either smaller than Character.MIN_RADIX or larger than Character.MAX_RADIX.
    • Any character of the string is not a digit of the specified radix, except that the first character may be a minus sign '-' ('\u002D') provided that the string is longer than length 1.
    • The value represented by the string is not a value of type int.
    Examples:
    parseInt("0", 10) returns 0
    parseInt("473", 10) returns 473
    parseInt("-0", 10) returns 0
    parseInt("-FF", 16) returns -255
    parseInt("1100110", 2) returns 102
    parseInt("2147483647", 10) returns 2147483647
    parseInt("-2147483648", 10) returns -2147483648
    parseInt("2147483648", 10) throws a NumberFormatException
    parseInt("99", 8) throws a NumberFormatException
    parseInt("Kona", 10) throws a NumberFormatException
    parseInt("Kona", 27) returns 411787

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

Discussions similaires

  1. J2EE Fonction Integer.parseInt(#code#)
    Par Earwenn dans le forum Général Java
    Réponses: 1
    Dernier message: 31/07/2013, 19h46
  2. souci avec Integer.parseInt
    Par amnass dans le forum Débuter avec Java
    Réponses: 12
    Dernier message: 10/12/2010, 01h16
  3. Réponses: 2
    Dernier message: 12/08/2009, 10h01
  4. Probleme avec Integer.parseint
    Par melek_net dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 21/11/2008, 19h24
  5. problème en Integer.parseInt
    Par aroua dans le forum Général Java
    Réponses: 3
    Dernier message: 11/04/2008, 15h48

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