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

Java Discussion :

Manipulation de byte, je ne comprend pas


Sujet :

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 Manipulation de byte, je ne comprend pas
    Bonjour,

    J'ai passé ma journée sur un bug que je ne comprend pas. J'ai finis pas le corriger, mais j'aimerais tout de même comprendre pourquoi sans cette correction, cela ne marche pas.

    J'ai le tableau de byte suivant : (chaque ligne correspond à une case du tableau, et je les représente sous le forme binaire)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    00111001
    00011111
    11100100
    01110101
    11111110
    Or, si je demande à Java de mes les traiter, il va les considérer avec ces valeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    00111001
    00011111
    1111111111100100
    01110101
    1111111111111110
    Cela se remarque notamment lorsque je lui demande d'afficher les byte via System.out.println(Integer.toByteString(i)).

    Pour corriger cela, je suis obliger d'appliquer un masque &0xFF afin de ne garde que le byte qui m'intéresse.

    Est ce que quelqu'un peut m'expliquer ce comportement ?

    On dirait que lorsque le bit de poid fort est à 1, alors java rajoute un byte suplémentaire. Mais pourquoi ?

  2. #2
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    En effet java ne fait pas directement de calcul des nombre de type byte. Ils sont d'abord convertis en int, quel que soit le bit de poids fort.

    Cependant, tous les types en java sont signés(a l'exception du char). Si tu connais le principe du complément a 2 qui sert a coder les nombres négatif, tu comprends que pour que le nombre reste négatif lors de la conversion, java le complète les octets supplémentaires avec des '1' si le premier bit vaut 1, avec des 0 sinon.

    Si tu veux que la conversion soit faite en considérant le byte comme non signé, on est en effet obligé de tricher un peu en utilisant (monByte&0xFF) a la place de monByte.
    L'opérateur & étant binaire, il n'est pas affecté par les problèmes de nombres signés ou non.

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    D'accord, merci bien. J'avais en effet utilisé le masque afin de garder ma valeur.
    Merci pour ce renseignement ^^

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

Discussions similaires

  1. Erreur Objet requis : 'this' --> Comprend pas!!
    Par Grozeil dans le forum ASP
    Réponses: 3
    Dernier message: 30/03/2005, 09h46
  2. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01
  3. sql ne comprend pas mon where!et me demande des parametres
    Par marie10 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 20/04/2004, 11h08
  4. [Rave] un message que je ne comprends pas
    Par Clotilde dans le forum Rave
    Réponses: 2
    Dernier message: 30/09/2003, 21h46

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