Savoir l'état des bits d'un octet [Résolu]

Messages postés
31
Date d'inscription
lundi 8 août 2005
Dernière intervention
16 avril 2008
- - Dernière réponse : cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
- 18 nov. 2006 à 13:24
souhaitant faire un petit algorithme de compression, j'avais vu que touts les lettres de l'alphabet ne prenaient pas plus de 5 bits d'un octet donc je vous  fait un exemple : a= 00000 , b = 00001 etc ... donc "abcd" ferait 000000000100010000110000 soit 3 octet. bon ça , c'est pour la compression.
mais après , comment faire pour que quand je prend un octet dans le fichier, je puisse voir les bits qu'il y a pour retrouver les caracteres ?
merci d'avance.
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
3
Merci
Salut
Reprenons les bases. D'ailleurs, je te conseille de jeter un oeil sur une ou des sources qui parlent de conversions de Base qui manupilent les Bytes (ou Octets) et les Bits.

Un Octet est composé de 8 bits (numérotés de 0 à 7).
Un Octet, dans sa représentation décimale peut prendre des valeurs de 0 à 255, ou 00 à FF en Hexa.
Pour écrire le Bit n°X d'un Octet, il te suffit de calculer 2^X (avec X de 0 à 7)
Pour lire le Bit n°X d'un Octet, il faut tester si Octet And 2^X = Octet

Ensuite, tu parles de String (Chaine).
Les Strings sont composés de caractères.
Chaque caractère est un Octet.

Donc, dans ton cas où tu veux coder les caractères sur 5 bits et pas 8, il faut abandonner la représentation alphabétique des caractères d'une String et travailler uniquement sur les valeurs numériques des Octets.
Dans ton exemple, si tu veux coder 'abc', cela te donnera la suite de 15 Bits suivants (la représentation standard des bits est toujours avec le bit de poids faible à droite et le bit de poids fort à gauche) :
Séparés par paquet de 5 bits : 000100000100000
La même chose en paquets de 8 bits (1 Octet) : x0001000 00100000
Le problème que tu auras, c'est de passer les 3 premiers bits du 'b' sur le premier octet et les 2 restant au début de l'octet suivant.
Le x correspond au premier bit du prochain caractère (même punition).
Ca va pas être du gateau, mais faisable.
Il faudra prendre en compte aussi que, à la relecture, tu ne pourras lire que des Octets, donc des multiples de 8, donc les derniers Bits seront peut-être inutilisés. Dans le pire des cas, tu n'auras qu'un seul Bit intéressant dans le dernier Octet, les 7 suivants seront restés à 0. Or, dans ta table de caratères, '00000' représente la lettre 'a'.
Il faut donc que tu sacrifies le '00000' pour qu'il ne représente rien et commencer le 'a' à '00001' sinon, tu risques de retrouver des 'a' fantômes à la fin.

En VB, il faut impérativement que tu travailles avec des tableaux de Byte (Octet) pour pouvoir changer d'octet de manière numérique.
Il va falloir :
- décortiquer la chaine d'origine pour retrouver la représentation des 5 bits en fonction de la lettre rencontrée. Un tableau initialisé au début de ton projet devrait faire l'affaire
- définir ne nombre d'Octets (de 8 bits) dont tu auras besoin : Il te suffit de calculer : NombreCaratères * 5 / 8 et l'arrondir à la valeur supérieure
- Ecrire : Ca va être un astucieux mélange de boucle For-Next et d'incrémentation.

Conclusion : Oui, c'est faisable, mais avant tout, il faut que tu te familiarises avec l'écriture et la lecture des Bits dans un Octet sur des exemples simples avant de te lancer dans ce programme.
Fabrique-toi et met au point ces procédures :
Sub BitEcrit (monOctet As Byte, NoBit As Integer, Etat As Boolean)
Sub BitLit (monOctet As Byte, NoBit As Integer, Etat As Boolean)
Fonction dans laquelle tu écriras/liras à 0 ou 1 (Etat) le Bit n° 'NoBit' (de 0 à 7) dans l'octet 'monOctet'
Aide toi de la calculette Windows en mode Scientifique pour vérifier ton programme.
Quand tu auras créé ces fonctions, tu auras 25% de ton projet de fait !

PS : Projet intéressant mais prévois de l'aspirine !

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

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 96 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Jack
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
0
Merci
Il faut simplement que tu fasse l'inverse de ce que tu fait à la compression.

Il faut que tu isole chaque groupe de 5 bits (dont certains seront répartis sur 2 octets).
Ensuite il te faut comme à la compression, une table de correspondance entre lecaractère réel et le caractère comprimé.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Commenter la réponse de cs_casy
Messages postés
31
Date d'inscription
lundi 8 août 2005
Dernière intervention
16 avril 2008
0
Merci
ok, merci mais juste un autre petit truc,  coment faire pour que quand je prends chaque octet, au niveau programmation, concaténer dans une string tous les bits ?
merci pour l'autre réponse
Commenter la réponse de nardelmouk
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
0
Merci
VB ne sait pas travailler sur les bits, il ne travaille que sur des octets.
Il faut donc faire des masques, des décalages, ...

Pour ton exemple :
Pour le premier octet, il sera égal aux 5 bits du premier caractère compressé auquels tu devra ajouter (addition) les 3 premiers bits de second caractère (donc masque) décalé (décalage ou multiplication) de 5 bits.
Le second octet prendra les 4eme et 5eme bits (donc masque) du second caractère, décalés pour venir en premier et second bit + les 5 bits du 3eme caractere décalés pour venir à partir du 3eme bit, + le premier bit du 4eme caractère dcalé pour venir en 8eme place.

Même si ton algo parait simple, la mise à oeuvre peut paraitre complexe. E toi de bien y réfléchir pour quelle ne devienne pas compliquée.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Commenter la réponse de cs_casy

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.