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

API standards et tierces Java Discussion :

Opération sur les bytes avec Byte.parseByte


Sujet :

API standards et tierces Java

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Par défaut Opération sur les bytes avec Byte.parseByte
    Bonjour à tous,

    J'ai un problème de conversions héxa -> binaire en java.

    Je récupère une chaine d'héxadécimale qui se trouve codée sur 16 octets, et je veux qu'elle passe sur 8.
    Je passe donc ma chaine (ex: 040d8226A4000100) en binaire, en ne prenant que les 4 derniers bits.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
            String byteBuff = "";
     
            byte[] text = new byte[8];
            byte[] textl = new byte[8];
            for (int i = 0; i < val.length(); i++) { //max i:16
                  byteBuff += StringUtils.leftPad(Integer.toBinaryString(Integer.parseInt("" + val.charAt(i), 16)), 4, "0");
            	//byteBuff = StringUtils.leftPad(Integer.toBinaryString(Integer.parseInt("" + val.charAt(i), 16)), 4, "0");
                  if (i % 2 != 0) {
     
                	 textl[i-1] = Byte.parseByte("01000100",2);
     
    					textl[i-1] = Byte.parseByte(byteBuff,2);
    					System.out.println(text[i-1]);
                        byteBuff = "";
                  }
     
            }
    Ma boucle dans le code ci-dessous, me coupe mon code binaire, et m'en refait un byte. Le problème est que, à un moment, j'ai ceci à convertir en byte: 82 en héxa soit 10000010 en binaire.
    Et là,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Byte.parseByte("10000010",2);
    refuse de passer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "main" java.lang.NumberFormatException: Value out of range. Value:"10000010" Radix:2
    Comment faire donc ?

    Je vous remercie tous !!!

  2. #2
    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
    Citation Envoyé par bobic Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Byte.parseByte("10000010",2);
    refuse de passer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "main" java.lang.NumberFormatException: Value out of range. Value:"10000010" Radix:2
    Comment faire donc ?
    Hélas, c'est l'abominable vérité : en Java les bytes, tout comme les shorts, ints et longs, sont signés. Ils peuvent être positifs ou négatifs.

    Les valeurs d'un byte vont donc de -128 à 127. Rien au-dessus, rien en-dessous.

    Or, 10000010 (base 2) c'est 130 (base 10). C'est plus que 127. Donc c'est en dehors des valeurs d'un byte. À noter que c'est le cas pour tout ce qui a le bit de poids fort à 1, autrement dit 80 (base 16) ou supérieur.

    Bien sûr, ce que tu veux, toi, c'est que dans ce cas-là, ça fasse un overflow et boucle sur les valeurs négatives. 130 c'est 127 + 3, et bouclant à partir de 127, on continue vers -128, -127, -126...
    Donc en arithmétique de bytes, 127 + 3 ça fait -126, et tu aurais voulu que parseByte() renvoie ça... Sauf que parseByte() ne fait pas d'overflow comme le fait l'addition.

    Deux possibilités pour :

    #1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte monByte = (byte)Integer.parseInt("10000010",2);
    ce qui renverra la valeur voulue.
    Par contre, problème, il acceptera aussi des valeurs sur 32 bits qui ne peuvent évidemment pas rentrer dans un byte, sans lever d'exception. Puisque c'est un int, et pas un byte, qu'on lui a demandé de parser.

    #2 :

    Coder ta propre méthode qui parse le binaire en un byte.

    Ou alors, faire un truc genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static byte parseUnsignedByte(String s, int base) {
      int i = Integer.parseInt(s, base);
      if(i < 0 || i >= 256) {
        throw new IllegalArgumentException(i + " is out of unisgned byte range");
      }
      return (byte) i;
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Par défaut
    merci à toi, en effet, ça marche
    Le prob, c'est que je suis parti sur la mauvaise piste
    Je te remercie vivement quand même

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

Discussions similaires

  1. Problème avec opération sur les double
    Par luimême dans le forum C#
    Réponses: 2
    Dernier message: 17/04/2008, 10h19
  2. Focus sur les boutons avec plusieurs formulaire
    Par davids21 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 19/04/2005, 15h48
  3. [C#] Calcul sur les dates avec des DateTimePicker
    Par alizee971 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 02/04/2005, 17h14
  4. opérations sur les bits d'un byte
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 10/02/2004, 20h42
  5. opérations sur les dates
    Par coucoucmoi dans le forum Débuter
    Réponses: 2
    Dernier message: 12/08/2003, 11h45

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