Manipuler les bits

Résolu
amaurysme62 Messages postés 9 Date d'inscription lundi 2 juin 2008 Statut Membre Dernière intervention 4 juin 2008 - 4 juin 2008 à 11:52
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 - 5 juin 2008 à 00:01
Bonjour tout le monde !

Alors après quelques recherches et essais hasardeux, je viens vous demander un petit coup de main...
Je débute en VB et moi & le binaire, on s'aime pas trop
Je dois lire des bits dans un fichier binaire, pour l'ouverture, tout est OK.
Je ne sais pas trop comment faire pour lire les bits puisque le ReadAllBytes, comme son nom l'indique lit toutes les données de mon fichier, alor que je ne veux que les bits 40 à 73.

J'ai ouvert le fichier avec un éditeur Hexa, au bit 40 j'ai :
05 01 05 01 05 01 05 01 05 01 06 01 06 01 06 01 ...

Alors ma question, est-il possible de faire un IF tout simplement , pour comparer une valeur en base 10 si je convertis la valeur dans le tableau avec Cuint ?
Si je met les octets 40 à 73 dans un tableau, est-ce que la fonction Cuint(tab(1)) pointera bien vers (05)16 ?

Merci pour le coup de main :)
Ps : Je suis sous VB2oo8

12 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
4 juin 2008 à 14:07
"...(*) En langage C, un Byte peut représenter plusieurs octets..."

Pourrais-tu donner quelques précisions stp Jack.!!!!!

Je suis surpris de lire cela car un Byte, par définition, représente toujours un octet, et ce quelque soit le langage. C'est du moins ce que j'ai appris.

Un caractère, oui, qui est censé etre un seul octet peut en réalité etre représenté sur 1,2 ou 4 octets suivant que c'est de l'ansi, unicode, .....

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
4 juin 2008 à 12:26
Salut
VB 2008 est du VB.Net, pas du VB6
Catégorie modifiée

Un Bit, c'est 0 ou 1
Un Byte (ou octet (*)), c'est 8 bits qui représentent un nombre de 0 à 255 décimal, ou 00 à FF hexadécimal
(*) En langage C, un Byte peut représenter plusieurs octets

Donc, tu parles de Bytes
Quand tu lis tes données, dans quoi les ranges-tu ?
Un tableau de Bytes serait tout indiqué.
Hexa ou décimal, ce n'est qu'une question d'affichage.

Pour ta question, fais l'essai, tu verras bien

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
amaurysme62 Messages postés 9 Date d'inscription lundi 2 juin 2008 Statut Membre Dernière intervention 4 juin 2008
4 juin 2008 à 13:04
Pour être le plus clair possible, j'ai 448 éléments codés chacun sur 2 octets.
 
J'ai peur de faire erreur, je demande juste qu'on me dise si mon raisonnement est bon.
Je dois relever donc 448 fois le premier et 448 fois le deuxieme octet.
Ainsi, 05 01 qui représente mes deux premiers octets aura le MSB de 05 et le LSB de 01 (précisé dans ma documentation technique)

Donc le 05 vaudra : 0101
et le 01 : 0001

Si c'est bien cela, comment retrouver le 0101 à partir du 05 ?
(j'ai essayé Cbyte mais sans trop de succès aparemment)

Merci
0
amaurysme62 Messages postés 9 Date d'inscription lundi 2 juin 2008 Statut Membre Dernière intervention 4 juin 2008
4 juin 2008 à 14:25
Avec méfiance, je dirai que c'est parce qu'en anglais, un octet se dit byte, donc 1 byte = 4 bits
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
4 juin 2008 à 14:32
Non, 1 byte = 8 bits

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
amaurysme62 Messages postés 9 Date d'inscription lundi 2 juin 2008 Statut Membre Dernière intervention 4 juin 2008
4 juin 2008 à 14:40
[mailto:Am@urysme
Am@urysme
]
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
4 juin 2008 à 18:09
Re
Honnètement, j'hésite toujours entre les appellations françaises et anglaises.

@Casy : Info récupérée ici http://fr.wikipedia.org/wiki/Byte

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
4 juin 2008 à 18:22
A propos de ta question, 01, bien que représenté par deux lettres (ou chiffres) correspond à un Byte (entre 00 et FF)
Pour la conversion en bits, je pense que .Net doit avoir une méthode de conversion, mais je ne la connais pas.

Pour la théorie, le code 05 correspond à 101 car (de droite à gauche) :
   1 x 2^0
+ 0 x 2^1
+ 1 x 2^2
+ 0 x 2^3
+ 0 x 2^4
...  
+ 0 x 2^7

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
4 juin 2008 à 18:28
En cherchant dans l'aide de VB 2008 parmi les sites partenaires de l'aide, je suis tombé sur <cette source>
Ca te donnera peut-être des idées

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
4 juin 2008 à 18:32
Voir aussi BitArray
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
4 juin 2008 à 19:47
Ok, je viens de lire ton lien Jack, mais bon, je suis toujours pas convaincu.
Ce document reste très vague et il y a quand même pas mal d'approximation.

L'auteur prétent que les bytes pouvaient faire 6,7,8 ou bits de long dans les années 70. Si je suis d'accord si les chiffres, personellement je n'ai pas souvenir d'avoir vu le terme "byte" employé autrement que pour 8bits, même à cette époque.

Pour ce qui est des télécommunications, les longueurs sont plutot de 6, 8 (avec la généralisation de l'informatique), 9, 12, ou 15 voire parfois 18 mais c'est rare.

Il prétent effectivement qu'un byte en langage C peut faire plus de un octet. Je suis pas un expert en C, mais je n'en ai jamais entendu parler. Soit.

Il pretent aussi qu'un mot peut faire 8,16,32,64 bits. Grave erreur. Ce sont des abus de langage que l'on entent parfois effectivement.

Mais un mot fait toujours 2 octets8 bits 1 octet 1 byte16 bits 2 octets 1 mot = 1 word en C = 1 short de manière générale32 bits 4 octets 1double mot = 1DWord en C = 1 long de manière générale64 bits 8 octets 1 DLong
Un integer (le fameux faux-amis) pouvant correspondre à un short, un word ou un dword suivant les plateformes.

Le problème est que .Net vient foutre la pagaille la dedant, puisque sous .Net, un integer c'est 4octets, un long c'est 8octets.

Pour ce qui est des informations de ce documents, je n'affirmerais pas le contraire car je ne connais pas tout, mais je reste quand même très prudent sur ce qui est dit.

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
5 juin 2008 à 00:01
Salut,

A mon avis, un Integer, "qu'on appelle parfois type de données entières (integral type data)" (Wikipedia),  est le "format de base" du système sur lequel on travail. C'était du moins le cas lorsque on a inventé ce terme. Sur la plupart de nos PC de nos jours, il s'aggit donc de 32 bits. Aujourd'hui, on a un même langage qui peut tourner sur des systèmes ayant différentes largeurs de bus, le terme n'est donc effectivement plus très clair.
Je signal que l'utlisation d'un mots de 32 bit sur une machine 32 bits sera la plus performante aussi bien en traitement CPU que lecture/enregistrement en mémoires.
Je pense que l'origine du mot byte est dans le même genre (c'était simplement la largeur du bus des 1er systèmes)
Mais ce n'est que mon avis

Maintenant, pour reprendre le problème de [auteur/AMAURYSME62/1408826.aspx amaurysme]. Déjà il semblerait en effet que tu confondes bit et Byte (ou octet), 1 Byte = 8 Bit (dans notre cas ). D'après ce que tu dis, tu parle de Bytes.

Lecture des données du fichier:

        ' Ouvrir le fichier
        Dim Stream As New IO.FileStream("C:\fichier.dat", IO.FileMode.Open)
        ' Avancer de 40 octets
        Stream.Seek(40, IO.SeekOrigin.Begin)
        ' Lire 34 octets
        Dim MyBytes(33) As Byte ' 33 pour avoir une taille de 34, car le 0 compte aussi
        Stream.Read(MyBytes, 0, 34)
        Stream.Close()

Tu dis que tu stoque des "éléments de 2 octets", donc tu peux aussi charger des Short (16bits), ça peut etre plus facile à gérer par la suite:

        ' Ouvrir le fichier
        Dim Stream As New IO.FileStream("C:\image.png", IO.FileMode.Open)
        ' Avancer de 40 octets
        Stream.Seek(40, IO.SeekOrigin.Begin)
        ' Lire 16 Short
        Dim reader As New IO.BinaryReader(Stream)
        Dim MesElements(16) As Short
        For i As Integer = 0 To 16
            MesElements(i) = reader.ReadInt16
        Next
        Stream.Close()

Donc maintenant que tu as tes 17 éléments, tu en fais ce que tu veux (je n'ai pas trop compris ce que tu voulais en faire)

"Si c'est bien cela, comment retrouver le 0101 à partir du 05"

Comme jack a dit: "Hexa ou décimal, ce n'est qu'une question d'affichage.", même chose pour le binaire.
Ca n'a donc plus rien a voir avec les données, il faudra le transformer en String si tu veux les afficher sous forme binaire ou hexa.

"Alors ma question, est-il possible de faire un IF tout simplement ,
pour comparer une valeur en base 10 si je convertis la valeur dans le
tableau avec Cuint ?"

Toujours la même chose, ce n'est qu'une question d'affichage. 10, que ce soit en bits, octets, integer, décimal ou en nombre flottant, c'est toujours 10. (je ne parle pas de la représentation graphique binaire "10" qui vaut 2)
         
0
Rejoignez-nous