Nous souhaitons réaliser une bibliothèque de lecture et écriture de fichiers bit par bit. Nous la testons ensuite pour coder une suite d'octets par paquets différentiels.
Implanter les fonctions de signature suivantes réalisant la lecture ou l'écriture d'entiers bit par bit dans un fichier :
-
BitFile * bitopen(const char * filename, const char * mode) : cette fonction ouvre en lecture ou écriture un fichier (selon la valeur de mode : 'r' ou 'w').
-
unsigned int bitread(BitFile * file, int k) : cette fonction retourne un entier non signé composé des k prochains bits du fichier
-
void bitwrite(BitFile * file, unsigned int a, int k) : cette fonction écrit les k bits de poids faible de l'entier non signé a dans le fichier
-
void bitclose(BitFile * file) : cette fonction ferme le fichier file (libération de la structure et du tampon), avec vidange du tampon s'il est en mode écriture
On prendra pour convention d'écrire les bits d'un entier de son bit de poids fort à son bit de poids faible. Les octets écrits sont également remplis en commençant par leur bit de poids fort. Par exemple si l'on souhaite écrire les entiers 6 (k=3 bits nécessaires) puis 64 (k=7 bits nécessaires) sur deux octets en commençant par un nouvel octet, nous obtenons 110.1000000 en binaire et ainsi deux octets 11010000, 00------, les tirets indiquants des bits non spécifiés du deuxième octet. En supposant ces bits nuls, nous avons les octets de valeur (unsigned char) 208 et 0. Il est possible d'utiliser une valeur de