Remplir un fichier binaire de BITS !!!!
Salut a tous.
Je suis nouveau ici et je nécessite votre aide en C pour un projet d'info (je suis en 2e année de license), je n'ai donc pas trop droit au C++ .....
voila je me suis tordu le cerveau dans tous les sens mais je vois pas comment je peut remplir un fichier binaire avec des bits, sachant que le C ne propose aucun type de moins d'un octet....
Pourquoi des bits et pas des 0 ou des 1 codés sur un octet (en char par ex)? et beh tout simplement parce qu'il s'agit d'un algo de compression texte et que si je fait ca mon fichier compressé sera plus lourd que la source .....
Merci a tous d'avance pour votre aide ...
Re: Remplir un fichier binaire de BITS !!!!
Citation:
Envoyé par ben13
voila je me suis tordu le cerveau dans tous les sens mais je vois pas comment je peut remplir un fichier binaire avec des bits, sachant que le C ne propose aucun type de moins d'un octet....
Pourquoi des bits et pas des 0 ou des 1 codés sur un octet (en char par ex)? et beh tout simplement parce qu'il s'agit d'un algo de compression texte et que si je fait ca mon fichier compressé sera plus lourd que la source .....
Soit tu considères que chaque byte prend la valeur 0 ou 1 (mais ce n'est effectivement pas très économe), soit tu considères que chaque byte porte 8 bits. Les bytes (unsigned char) mis bout à bout forment alors une séquence de bits (ou un tableau de bits) facilement adressable moyennant un calcul trivial.
Exemple : je veux mettre la séquence '100110110101011001101' dans un fichier (ou flux) de bytes :
Il suffit de grouper les bits par paquets de 8 en partant de la gauche (MSB en tête)
Code:
1 2 3 4
|
1001 1011
0101 0110
0110 1000 |
ce qui donne
Il faut bien sûr quelque part une info (en tête, selon le principe Longueur, Valeur) qui indique le nombre de bits (ici 21, soit $15)
Par exemple :
Code:
1 2 3
|
L- V--------
15 9B 56 68 |
Si le format supporte des types mixtes, un format TLV est envisageable :
Par exemple :
Code:
1 2 3 4 5 6 7
|
00 = Bit
01 = Octet
etc.
T- L- V--------
00 15 9B 56 68 |
Si un codage de la longueur sur 1 octet (0-255) ne suffit pas, on peut décider de faire le codage de la longueur sur 2 octets (MSB en tête)
Code:
1 2 3
|
T- L---- V--------
00 00 15 9B 56 68 |
On peut aussi réduire le nombre de bits pour les types (16 types = 4 bits MSB) et utiliser les LSB pour la longueur (000-FFF):
Code:
1 2 3 4 5 6 7 8 9
|
TL--- V--------
00 15 9B 56 68
----[0]---- ----[1]----
7654 3210 7654 3210
Type Longueur-------
0000 0000 0001 0101
Bit 015 |