Vous pouvez utiliser les étapes ci-dessous pour lire les bits d'un fichier binaire.
Utilisez mmap pour mapper votre fichier de données binaires en mémoire. Si votre taille de fichier n'est pas en multiples d'octets alors vous aurez des bits de remplissage à la fin de votre région de mémoire mappée. Le nombre de bits de remplissage peut être compris entre 1 et 7.
Maintenant, vous pouvez lire les bits requis de la région mappée en mémoire à l'aide de masques bit. Notez que vous devez utiliser une opération AND au niveau des bits. La valeur des masques de bits variera selon la plate-forme little-endian et big-endian. Ainsi, le code ne sera pas portable et nécessite un soin particulier pour la portabilité. En outre, vous devrez peut-être également utiliser l'opérateur de rotation droite ou gauche au niveau du bit.
Vous pouvez également taper-cast partie de la région de mémoire mappée comme les structures de données C avec les champs de bits. Ici, nous devons demander au compilateur de ne pas utiliser de remplissage dans les structures C++ pour l'alignement des octets. Cela peut être réalisé en utilisant la directive "#PRAGMA PACK (1)". Encore une fois, les structures C++ avec des champs de bits ne sont pas portables sur les plates-formes little-endian et big-endian.
La petite variation dans la méthode ci-dessus peut être utilisée pour écrire des bits dans un fichier binaire.
Pourquoi avez-vous besoin d'emballer vos données aussi étroitement? Avez-vous envisagé d'utiliser une bibliothèque de compression (par exemple, zlib) à la place? Ce sera plus facile pour vous, et prendra probablement moins de place. –
Vos bits sont-ils regroupés dans des blocs alignés sur des octets? Si c'est le cas, vous pouvez lire les octets normalement et obtenir les bits en utilisant le décalage de bits et les masques de bits. –