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 :

manipulation de Byte, bit et int


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut manipulation de Byte, bit et int
    Bonjour,

    je travaille sur un decoder de paquet. je dois donc lire byte par byte le paquet et stocker les données dans les classes representant le protocole.

    Ma question est je dois lire les 4 premiers bit d'un byte. Comment je peux faire?
    Voila ce que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int aux=DecoderHelper.extractInteger(combined,offset,1); // transforme le byte en intier
    int Optional = (aux & 0x01);
    int Transitive = (aux & 0x01)>>>1;
    int Partial = (aux & 0x01)>>>2;
    int ExtendedLength = (aux & 0x01)>>>3;
    le resultat est que j'ai des zero partout Alors que la valeur du byte est 40, c est a dire 64 en decimal (valeur de aux) et en binaire ca fait 0100 0000
    donc le resultat devrait etre
    optional = 0; transitive = 1; partial = 0 et extendedLength = 0


    Merci de votre aide

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 75
    Par défaut
    Bonjour,

    Tu dois d'abord réaliser le décalage puis le masque : (aux>>1)&0x01
    (d'ailleurs j'utilise ">>" et non ">>>" et ça marche).

    Nil

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    j ai change le code comme tu me l'as conseillé mais j ai toujours mes quatre variables à zéro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    route.setOptional(aux & 0x01);
    route.setTransitive((aux>>1) & 0x01);
    route.setPartial((aux>>2) & 0x01);
    route.setExtendedLength((aux>>3)& 0x01);
    Quelle est la difference entre >> et >>> ?
    Et que signifie le 0&10 ?

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par Edta Voir le message
    j ai change le code comme tu me l'as conseillé mais j ai toujours mes quatre variables à zéro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    route.setOptional(aux & 0x01);
    route.setTransitive((aux>>1) & 0x01);
    route.setPartial((aux>>2) & 0x01);
    route.setExtendedLength((aux>>3)& 0x01);
    Quelle est la difference entre >> et >>> ?
    Et que signifie le 0&10 ?
    Normal, tu lis les 4 premiers bits, et non les 4 derniers. Tu dois donc faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    route.setOptional( ( aux >> 4 ) & 1 );
    route.setTransitive( ( aux >> 5 ) & 1 );
    route.setPartial( ( aux >> 6 ) & 1);
    route.setExtendedLength( ( aux >> 7 ) & 1);
    le "& 1" suffit, puisque "1" décimal vaut aussi "1" en hexa.
    "0x01" est la valeur hexadécimale "1" décimal. "&" permet de faire un "ET" binaire entre deux entiers.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par Edta Voir le message
    Quelle est la difference entre >> et >>> ?
    (je n'avais pas vu cette question )

    ">>" décale les bits à droite en conservant le signe.
    ">>>" décale les bits à droite, ainsi que le signe. Cet opérateur modifiera le signe d'un entier négatif.
    Le signe est porté par le bit de poids le plus fort.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Normal, tu lis les 4 premiers bits, et non les 4 derniers.
    ma question est bien de lire les quatre premiers bit.

    J'ai essayé de changer la valeur du 0x01 en 1 mais le resultat sont toujours des zero

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par Edta Voir le message
    ma question est bien de lire les quatre premiers bit.

    J'ai essayé de changer la valeur du 0x01 en 1 mais le resultat sont toujours des zero
    Ce n'est pas ce que tu dis dans ton premier post :

    Citation Envoyé par Edta Voir le message
    le resultat est que j'ai des zero partout Alors que la valeur du byte est 40, c est a dire 64 en decimal (valeur de aux) et en binaire ca fait 0100 0000
    donc le resultat devrait etre
    optional = 0; transitive = 1; partial = 0 et extendedLength = 0
    Pour la numérotation des bits, on compte de droite à gauche, du poids le plus faible au poids le plus fort :
    optional est le 8eme bit
    transitive le 7eme
    partial le 6eme
    extendedLength le 5eme.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  8. #8
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    effectivement les bits se comptent dans ce sens la. A force de regarder la specification du protocole qui numerote la ligne 0 1 2 .... je me suis mis dans la tete que ca correspondait aussi a la position du bit.....

    tout marche bien. Merci pour votre aide et vos explications

  9. #9
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    Bonjour,

    J'ai a nouveau besoin de decoder des octets mais j'ai le meme probleme qu'avant. Je n'arrive pas a avoir les valeurs que je souhaite.

    Voila comment est decouper mon octect :
    - 3 premier bit : res
    - 4 bits suivant : type
    - dernier bit : X

    Voila le code ecrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int aux = DecoderHelper.extractInteger(combined,offset,1);
    		res = (aux >> 7) & 1 + (aux >> 6) & 1 + (aux >> 5) & 1;
    		type = (aux >> 4) & 1 + (aux >> 3) & 1+ (aux >> 2) & 1 + (aux >> 1) & 1;
    		X = (aux >> 0) & 1;
    Plus que d'avoir la solution donnee. Je prefererai que quelqu'un m explique clairement comment marche ces conversions. car je pourrai etre a nouveau confronte au probleme et je pense pas que demande a chaque fois de l aide soit une tres bonne solution. Si vous avez un lien sur un cours ca me convient aussi j ai cherche sur internet mais rien que j arrive a comprendre...)

    Merci de votre aide

  10. #10
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Première étape : écrire un octet sur papier. Les bits de poids forts à gauche, comme si tu écrivais un nombre entier en base 10.
    Ensuite, le décalage : l'opérateur ">>" décale tous les bits vers la droite. Donc les bits de poids faible seront supprimer.
    Enfin, le masquage. Pour s'assurer de n'avoir que les bits qui t'intéressent, il faut faire un "et" logique pour supprimer les bits de poids plus fort, s'ils existent.

    Dans ton cas, pour obtenir les 4 bits pour le type, il faut d'abord écrire un octet sur ta feuille de papier (0 pour les pas intéressants):
    Tu veux supprimer le bit de poids faible :
    Ton octet ressemble donc à (le décalage à introduit un nouveau bit de poids fort à zéro):
    Maintenant, il faut t'assurer que les 4 bits de poids fort ne sont pas pris, d'ou le masquage :
    Comment construire ce "15" ? Il suffit de convertir le nombre binaire "1111" en décimal.
    Bon courage
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  11. #11
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    ok Donc si j'ai bien compris pour le res ca me donne la chose suivante

    sur le papier: 1 1 1 0 0 0 0 0

    un decalage de 5 (le nombre de zero)

    et pour le ET logique la valeur 7 (decimal de 111)

    donc j'ecris :
    res = (octet >> 5) &7;

  12. #12
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Sinon, on se souvient qu'on fait du java, et on utilise l'api avec des objets comme le bytebuffer.

  13. #13
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par Edta Voir le message
    ok Donc si j'ai bien compris pour le res ca me donne la chose suivante

    sur le papier: 1 1 1 0 0 0 0 0

    un decalage de 5 (le nombre de zero)

    et pour le ET logique la valeur 7 (decimal de 111)

    donc j'ecris :
    res = (octet >> 5) &7;
    C'est ça ;-)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  14. #14
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par Faiche Voir le message
    Sinon, on se souvient qu'on fait du java, et on utilise l'api avec des objets comme le bytebuffer.
    Il ne permet pas de manipuler les bits des octets
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  15. #15
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    Merci Dinobogan pour ce petit cours tres instructif. Car je pense que j'aurai bien d'autre d'occassion de l'utiliser.

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

Discussions similaires

  1. Ca doit etre la surchauffe: manipuler des byte
    Par TheCaribouX dans le forum C#
    Réponses: 12
    Dernier message: 09/04/2008, 11h37
  2. Manipulation d'un bit sur un entier
    Par SybVicious dans le forum Débuter
    Réponses: 20
    Dernier message: 30/07/2007, 23h31
  3. Conversion d'un byte[] vers un int[]
    Par ludosoft dans le forum Langage
    Réponses: 10
    Dernier message: 11/01/2007, 16h10
  4. Manipulations sur les bits
    Par ThE_LaSt dans le forum C
    Réponses: 23
    Dernier message: 27/03/2006, 14h22
  5. bits,bytes,bit word ?
    Par Battosaiii dans le forum C
    Réponses: 2
    Dernier message: 17/03/2006, 11h29

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