2010-01-13 5 views
2

Je voudrais lire et écrire n bits de/vers des fichiers binaires. Par exemple, lisez les n bits suivants dans un entier ou les n bits suivants pour un caractère. J'ai besoin que les données soient alignées et non alignées.Lecture et écriture alignées sur les bits à partir de fichiers binaires

Y at-il des bibliothèques C++ qui me permettent de faire cela? Lorsque j'utilise ostream/istream, il me semble que l'utilisation de données alignées sur les octets est limitée à 0 octet. Ce n'est pas assez bon si je veux que mes données soient bien emballées.

+0

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. –

+0

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. –

Répondre

1

L'accès aligné sur les octets est "assez bon" si vous utilisez le niveau binaire pour vous connecter, bien sûr. :)

Here est une bibliothèque de "bitfile" qui ressemble à ce que vous voulez. Je n'ai pas testé cela moi-même, mais cela semble raisonnablement minimaliste.

+0

Lien est mort, et la source n'est pas sur archve.org – MarcusJ

+1

@MarcusJ Merci, j'ai permuté dans une autre bibliothèque d'E/S orientée bits (non testée). – unwind

+0

Merci, j'ai du mal à écrire mon propre lecteur de bits (surtout quand il s'agit de l'endian swapping, j'espère que le support int au lieu de lire comme un char, etc) – MarcusJ

0

Vous pouvez utiliser les étapes ci-dessous pour lire les bits d'un fichier binaire.

  1. 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.

  2. 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.

Questions connexes