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 :

Affichage binaire d'un octet


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut Affichage binaire d'un octet
    Bonjour,

    Simple curiosité, comment procéder pour afficher le contenu d'un octet sous forme binaire

    Je sais qu'en C , c'est possible mais en JAVA, je ne vois pas

    Merci

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 109
    Par défaut
    Avec ceci :
    FAQ
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut Bonjour wax
    Ok mais ici , c'est le contenu d'un octet au cours d'une lecture de

    type DataInputStream --> readInt()

    Je voudrais visualiser chacun des 4 octets qui code un entier

    sous forme binaire

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 109
    Par défaut
    Pour récupérer les 4 octets, bah c'est comme en C...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    byte v1 = (byte) (var & 0x000000FF);
    byte v2 = (byte) ((var & 0x0000FF00) >> 8);
    byte v3 = (byte) ((var & 0x00FF0000) >> 16);
    byte v4 = (byte) ((var & 0xFF000000) >> 24);
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut
    Ok merci de ta réponse MAIS quand j'ai un byte

    comment je fais pour l'afficher sous forme de 0 et de 1 ???

    C'est çà mon problème

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 109
    Par défaut
    Comme j'ai essayé de le dire juste avant, tu peux utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Integer.toBinaryString(chiffre);
    Tu devras peut être rajouté des 0 pour avoir les 8 bit.

    Sinon tu peux le faire tout a la main avec un boucle... sauf si quelqu'un d'autres a une autre solution
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut Un peu de précision
    Au départ, j'ai écris ds un fichier --> entiers.bin

    un flux avec DataOutputStream

    J'écris ds le flux 2 entiers avec writeInt() --> entier : 130
    -->entier : 66000

    Ensuite ds un second programme , je veux lire les deux entiers avec

    RandomAccessFile ,ce qui fonctionne très bien , par la suite je me suis intéressé à la question de départ --> découper un entier en 4 octets et afficher chaque octet en binaire

    Le résultat est bizarre
    Voici le code avec le résultat pour le premier entier : 130

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    package ajeter;
     
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.RandomAccessFile;
    import java.nio.ByteBuffer;
    import java.nio.ByteOrder;
     
    public class Acces_direct_binaire 
    {
    	public static void main (String args[]) throws IOException
    	{ 
    		 String nomfich ;
     
    	int n, num ;
    	RandomAccessFile entree ;
     
    	System.out.print ("donnez le nom du fichier a consulter : ") ;
    	nomfich = Clavier.lireString() ;
    	entree = new RandomAccessFile (nomfich, "r") ;
    		do
    		{ System.out.print ("Numero de l’entier recherche : ") ;
    		num = Clavier.lireInt() ;
    		if (num == 0) break ;
    		entree.seek (4*(num-1)) ;
    		n = entree.readInt() ;
     
    		System.out.println("Affichage binaire d'un entier ");
    		Integer i = Integer.valueOf(n);
    		String affbinaire = i.toBinaryString(n);
    		System.out.println(affbinaire);
     
    		System.out.println("Affichage des octets ");
    		ByteBuffer b = ByteBuffer.allocate(4);
     
    		b.putInt(n);
     
    		byte[] octets = b.array();
    		for (byte c : octets) {
    			System.out.print(c + " : ");
    			Integer j = new Integer(0); 
    		    Integer k = j.valueOf(c);
    			String affbinaire2 = j.toBinaryString(i);
    			System.out.println("affbinaire2 : " + affbinaire2);
     
    		}
    		System.out.println (" valeur = " + n) ;
     
    		}
    		while (num != 0) ;
    		entree.close () ;
    		System.out.println ("*** fin consultation fichier ***");
    	}
     
    }
     
    /*
    RESULTAT
    donnez le nom du fichier a consulter : entiers.bin
    Numero de l’entier recherche : 1
    Affichage binaire d'un entier 
    10000010
    Affichage des octets 
    0 : affbinaire2 : 10000010
    0 : affbinaire2 : 10000010
    0 : affbinaire2 : 10000010
    -126 : affbinaire2 : 10000010
     valeur = 130
    Numero de l’entier recherche : 
    */

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Integer.toBinaryString() est une méthode static. Ça veut dire qu'il ne faut pas faire des trucs comme j.toBinaryString(c) mais seulement Integer.toBinaryString(c)
    Un seul variant : le paramètre de la méthode, le nombre qu'on veut écrire en binaire.

    À part ça : là, à chaque fois, c'est i que tu écris en binaire. Tu cherchais à écrire c.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut
    Bonjour Thelvin,

    Ok je me suis trompé et en meme temps j'ai corrigé en tenant compte de tes conseils.

    Voici le nouveau code
    Est-ce correct et peux-tu me commenter le résultat

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    package ajeter;
     
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.RandomAccessFile;
    import java.nio.ByteBuffer;
    import java.nio.ByteOrder;
     
    public class Acces_direct_binaire 
    {
    	public static void main (String args[]) throws IOException
    	{ 
    		 String nomfich ;
     
    	int n, num ;
    	RandomAccessFile entree ;
     
    	System.out.print ("donnez le nom du fichier a consulter : ") ;
    	nomfich = Clavier.lireString() ;
    	entree = new RandomAccessFile (nomfich, "r") ;
    		do
    		{ System.out.print ("Numero de l’entier recherche : ") ;
    		num = Clavier.lireInt() ;
    		if (num == 0) break ;
    		entree.seek (4*(num-1)) ;
    		n = entree.readInt() ;
     
    		System.out.println("Affichage binaire d'un entier ");
    		String affbinaire = Integer.toBinaryString(n);
    		System.out.println(affbinaire);
     
    		System.out.println("Affichage des octets ");
    		ByteBuffer b = ByteBuffer.allocate(4);
     
    		b.putInt(n);
     
    		byte[] octets = b.array();
    		for (byte c : octets) {
    			System.out.print(c + " : ");
     
    			Byte bcl = c ;
    			int j  = bcl.intValue(); 
    		    System.out.println(Integer.toBinaryString(j));
     
     
    		}
    		System.out.println (" valeur = " + n) ;
     
    		}
    		while (num != 0) ;
    		entree.close () ;
    		System.out.println ("*** fin consultation fichier ***");
    	}
     
    }
     
    /*
    RESULTAT
    donnez le nom du fichier a consulter : entiers.bin
    Numero de l’entier recherche : 1
    Affichage binaire d'un entier 
    10000010
    Affichage des octets 
    0 : 0
    0 : 0
    0 : 0
    -126 : 11111111111111111111111110000010
     valeur = 130
    Numero de l’entier recherche : 2
    Affichage binaire d'un entier 
    10000000111010000
    Affichage des octets 
    0 : 0
    1 : 1
    1 : 1
    -48 : 11111111111111111111111111010000
     valeur = 66000
    Numero de l’entier recherche : 0
    *** fin consultation fichier ***
     
    */

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Il a l'air correct. Il tourne bien trop en rond pour peu de choses, éclater un int en 4 bytes ça prend 4 lignes : une par byte. Mais il a l'air correct.


    Il y a juste un souci à l'affichage des bytes négatifs (ceux de -128 à -1). Vu que tu les convertis en String avec Integer.toBinaryString(), les bytes sont d'abord castés en int, ce qui conserve le signe : un byte qui vaut -1 sera casté en int qui vaut -1.
    Du coup à l'écriture en binaire, tu te retrouves avec une longue chaîne de 1 alors qu'un byte ne devrait avoir que 8 bits. Oui, mais là c'est un int, de 32 bits, qu'on affiche.
    Pour résoudre le problème, il faut que la conversion byte -> int ne conserve pas le signe, mais qu'elle conserve les 8 bits de poids faible du byte, et laisse le reste à zéro.

    Ça peut se faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Integer.toBinaryString(j & 0xFF)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut Bonsoir Thelvin
    Merci de ta réponse,
    En faisant queleques recherches, je suis arrivé aux opérations binaires et aux masques . Il s'agit de cela ici.

    En pratique, se sert-on souvent de cela ??
    Bien maitriser cette technique a t-il une importance primordiale ??

    Merci

  12. #12
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 109
    Par défaut
    Disons que c'est la base de nos ordinateurs ^^

    Maitriser cela n'est pas compliqué. Nécessaire, non pas forcement mais c'est quand même un fondamental, bien que parfois on peux utiliser que des librairies qui masqueront ce genre d'opérations.

    Tu peux t'en servir a moult reprises. Par exemple quand tu joue avec des tableau d'entier que tu dois convertir en Rouge Vert Bleu et ce genre d'opérations (ce n'est qu'un exemple que j'utilise de manière récurrente)
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut
    Merci Messieurs,

    Quand il faut, il faut ... J'ai donc regardé de plus près le binaire et ses opérateurs

    Je cite à cet effet 2 tutos qui m'ont bien aidé

    http://gfx.developpez.com/tutoriel/java/binaire/

    et

    http://www.ukonline.be/programmation...tre2/page5.php

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

Discussions similaires

  1. probléme lecture de fichier binaire octer par octet
    Par ousmanesidibe dans le forum C++
    Réponses: 2
    Dernier message: 12/12/2009, 22h34
  2. [2.0] Affichage binaire d'un nombre
    Par MattC dans le forum C#
    Réponses: 7
    Dernier message: 12/10/2007, 12h41
  3. Valeur négative en binaire sur 2 octets
    Par declencher dans le forum Delphi
    Réponses: 7
    Dernier message: 03/05/2007, 15h01
  4. Affichage d'un nombre binaire
    Par Jero13 dans le forum C
    Réponses: 5
    Dernier message: 05/12/2005, 23h17
  5. Affichage d'entiers en binaire.
    Par Tifauv' dans le forum C
    Réponses: 4
    Dernier message: 08/12/2003, 21h54

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