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 :

Java, primitif, et chaine hexa


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut Java, primitif, et chaine hexa
    Bonjour,
    j'ai décidément un problème avec ca.
    J'ai des chaine hexadécimal qui code variablement des entiers signés ou non.
    Pour obtenir le nombre j'effectue donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    long l = Long.parseLong(maChaine, 16);
    Obtenant des résultat étrange, je fais quelques tests.

    Je prend la valeur Long.MaxValue que je transforme via la fonction Long.toHexaString(long) en une chaine hexa. J'obtiens 7fffffffffffffff.
    Je re convertie cette chaine en long via ma première fonction, et obtiens bien la valeur initiale.

    Je teste cette fois avec l'inverse, c'est à dire Long.MinValue, et obtiens la chaine hexa : 8000000000000000.
    Par contre, si je veux transformer cette chaine hexa en un long, alors une NumberFormatException est remontée.

    Donc je ne comprend pas trop comment tout ca marche

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 42
    Par défaut
    Salut,
    c'est normal il te dis que le max qu'il peut mettre est 7FFFF.... ce qui fait (2 puissance 63 )-1 et toi, tu lui donne plus, 800.... (2 puissance 63 ) donc il ne peut pas le parse car il est trop grand.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 71
    Par défaut
    Aie !

    Alors, de ce que je connais. Quand tu formates une valeur (on va prendre des données sur 1 octet pour faire court) sous la forme d'une chaine hexa, le toHexString qui correspond à ton type te donne la représentation qui match exactement avec la représentation binaire de la valeur.

    Mettons pour l'exemple qu'on considère des byte signés. la valeur 1 en binaire, c'est ... 1 et en hexa... aussi. La représentation binaire de -1, avec la représentation en complément à 2 du Java (tu es OK avec le complément à 2 ??), c'est 11111111 soit FF en hexa. Et c'est ce que te donne le toHexString.

    Par contre, quand on parse une chaine de caractères qui contient une valeur binaire, le signe n'est pas donné de la même manière, il doit être donné par un caractère '-' pour les valeurs négatives (cf. Javadoc de Integer.parseInt(String, int)). Mais s'il n'y a pas de signe '-' devant, il va chercher à traiter une valeur positive. Or dans ton cas 7FFFFFFFFFFFFFFFF + 1 = 8000000000000000. Donc 8000000000000000, pris comme une valeur positive, est trop grande pour rentrer dans un Long (c'est Long.MAX_VALUE + 1).

    En fait, il faudrait, je pense, dans ton cas que tu pré-analyse ta chaine de caractères pour savoir si la valeur binaire qui correspond à pour dernier bit 1, si c'est le cas, il faudra la voir comme une valeur négative (comme dans 8000 hexa qui s'écrit 1000000000000000 en binaire) et transformer la chaine pour qu'elle corresponde à une valeur négative.

    Ceci dit, vu comme ça, ça me semble quand même très lourd comme traitement. Je vais réfléchir un peu à la question...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Par défaut
    Est ce que la méthode decode ne ferait pas l'affaire ?

    System.out.println(Long.decode("0xffffffffff"));
    1099511627775

    System.out.println(Long.decode("-0xffffffffff"));
    -1099511627775

    Si ce n'est pas cela, désolé ^^.

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    Si je comprend bien, si on me fournie une chaine hexadécimal (d'un fichier, ou d'un flux par exemple) qui peut coder une valeur négative, et que rien n'est dit à coté que cette chaine code une valeur négative, je ne peux savoir que cette valeur sera négative ?

    edit : rah des chanement pendant que je post, bon je lis et j'édite fonction ^^

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 71
    Par défaut
    Citation Envoyé par clemi Voir le message
    Est ce que la méthode decode ne ferait pas l'affaire ?

    System.out.println(Long.decode("0xffffffffff"));
    1099511627775

    System.out.println(Long.decode("-0xffffffffff"));
    -1099511627775

    Si ce n'est pas cela, désolé ^^.
    Malheureusement, je ne pense pas que rajouter un '-' devant la valeur solutionne le problème. Essaye avec un int, -1 par exemple. En hexa FFFFFFFF. Si tu prends la chaîne "-FFFFFFFF", ça ne te donne pas -1 en la parsant mais... une exception. C'est assez logique d'ailleurs parce que la représentation hexa de -1 en utilisant le caractère '-' pour "illustrer" le signe, c'est... -1.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 71
    Par défaut
    Citation Envoyé par Djobird Voir le message
    Si je comprend bien, si on me fournie une chaine hexadécimal (d'un fichier, ou d'un flux par exemple) qui peut coder une valeur négative, et que rien n'est dit à coté que cette chaine code une valeur négative, je ne peux savoir que cette valeur sera négative ?

    edit : rah des chanement pendant que je post, bon je lis et j'édite fonction ^^
    Je pense qu'il faudrait qu'on en sache plus sur la représentation des valeurs qui sont mises à ta disposition.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 42
    Par défaut
    Citation Envoyé par Djobird Voir le message
    Si je comprend bien, si on me fournie une chaine hexadécimal (d'un fichier, ou d'un flux par exemple) qui peut coder une valeur négative, et que rien n'est dit à coté que cette chaine code une valeur négative, je ne peux savoir que cette valeur sera négative ?

    A vrai dire cela dépend du codage, si c'est codé en hexa signé ou non.
    Si c'est signé, je crois que c'est le premier bit qui indique le signe -/+

  9. #9
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    J'ai tout les cas possible en fait. Je reçois une chaine hexadécimal qui peut codé un entier signé ou non, un float, des string etc ... Je sais ce que chaque chaine doit coder (je sais par exemple que derrière c'est un entier signé)

    Par exemple la chaine :
    0x40136C16C0000000
    Permet de coder un long signé. Mais je ne sais rien concernant le signe de cet entier.
    Comment puis je faire la conversion dans ce cas ?

    Edit : Oui le premier bit permet de savoir si la valeur est négative ou non. Mais si j'ai compris les explications, quand je donne à la fonction Long.parseLong(str,16), la chaine str est considéré comme positive :/

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 42
    Par défaut
    Bonsoir,

    La classe BigInteger ne serait-elle pas une solution ? J'ai déjà eu ce problème il y a quelque temps et je l'avais résolu ainsi. Du moins, il faudrait que je vérifie. En effet, BigInteger ne connait pas de limite de capacité, donc si 7FFFFFFFFFFFFFFFF fonctionne, 80000000000000000 fonctionnera aussi. Alors après pour la question du signe, je ne me prononcerai pas, je ne me souviens plus assez.

Discussions similaires

  1. Comment chercher une chaine hexa dans un fichier ?
    Par marchphi dans le forum Langage
    Réponses: 4
    Dernier message: 26/02/2008, 07h59
  2. conversion chaine hexa en int
    Par Biosox dans le forum SL & STL
    Réponses: 2
    Dernier message: 31/05/2007, 11h17
  3. Charger une image à partir d'une chaine HEXA
    Par Argonz dans le forum Delphi
    Réponses: 4
    Dernier message: 15/03/2007, 08h38
  4. concatener plusieurs booléen en chaine hexa
    Par Emcy dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 06/02/2007, 13h04
  5. [VB.NET] Convert chaine hexa -> int
    Par Tempotpo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/03/2005, 08h53

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