Savoir l'état des bits d'un octet

Résolu
nardelmouk Messages postés 30 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 16 avril 2008 - 18 nov. 2006 à 11:25
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur 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.

4 réponses

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
18 nov. 2006 à 13:24
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)
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
18 nov. 2006 à 11:54
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 #
0
nardelmouk Messages postés 30 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 16 avril 2008
18 nov. 2006 à 12:05
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
18 nov. 2006 à 12:17
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 #
0
Rejoignez-nous