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
Version imprimable
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
Avec ceci :
FAQ
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
Pour récupérer les 4 octets, bah c'est comme en C...
Code:
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);
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
Comme j'ai essayé de le dire juste avant, tu peux utiliser :
Tu devras peut être rajouté des 0 pour avoir les 8 bit.Code:Integer.toBinaryString(chiffre);
Sinon tu peux le faire tout a la main avec un boucle... sauf si quelqu'un d'autres a une autre solution :)
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:
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 lentier 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 lentier 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 lentier recherche : */
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.
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:
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 lentier 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 lentier recherche : 1 Affichage binaire d'un entier 10000010 Affichage des octets 0 : 0 0 : 0 0 : 0 -126 : 11111111111111111111111110000010 valeur = 130 Numero de lentier recherche : 2 Affichage binaire d'un entier 10000000111010000 Affichage des octets 0 : 0 1 : 1 1 : 1 -48 : 11111111111111111111111111010000 valeur = 66000 Numero de lentier recherche : 0 *** fin consultation fichier *** */
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:Integer.toBinaryString(j & 0xFF)
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
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)
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