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

nardelmouk 31 Messages postés lundi 8 août 2005Date d'inscription 16 avril 2008 Dernière intervention - 18 nov. 2006 à 11:25 - Dernière réponse : cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention
- 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 

4 réponses

Répondre au sujet
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 18 nov. 2006 à 13:24
+3
Utile
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)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Jack
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 18 nov. 2006 à 11:54
0
Utile
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
nardelmouk 31 Messages postés lundi 8 août 2005Date d'inscription 16 avril 2008 Dernière intervention - 18 nov. 2006 à 12:05
0
Utile
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
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 18 nov. 2006 à 12:17
0
Utile
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.