La lecture d'un fichier binaire, bit par bit
Je sais que la fonction ci-dessous:
size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
Il ne lit octet par octet, mon objectif est d'être capable de lire les 12 bits à la fois et de les emmener dans un tableau. De l'aide ou des pointeurs serait grandement apprécié!
Désolé, un octet à la fois est la plus petite granularité que vous pouvez faire. Vous devrez recourir à l' (frisson) programmation à répartir sur 12 bits entités.
Je pense que vous voulez cette réponse: stackoverflow.com/questions/141525/...
Je pense que vous voulez cette réponse: stackoverflow.com/questions/141525/...
OriginalL'auteur Ryan | 2012-07-27
Vous devez vous connecter pour publier un commentaire.
Ajout pour le premier commentaire, vous pouvez essayer de la lecture d'un octet à la fois (déclarer une variable char et y écrire), puis utilisez les opérateurs au niveau du bit >> et << lire peu à peu. Lire la suite ici: http://www.cprogramming.com/tutorial/bitwise_operators.html
OriginalL'auteur Carlos Vergara
Lire les deux premiers octets à partir de votre
a_file
pointeur de fichier et vérifier les bits les moins ou plus d'octets selon le endianness de votre plate-forme (x86 est little-endian) — à l'aide de bitshift opérateurs.Vous ne pouvez pas vraiment mettre des bits dans un tableau, comme il n'y a pas un type de données pour bits. Plutôt que d'en garder 1 et de 0 dans un tableau, qui est inefficace, il semble moins cher juste pour garder les deux octets dans un tableau à deux éléments (par exemple, de type
unsigned char *
) et écrire les fonctions de la carte de ces deux octets pour l'un de 4096 (2^12) les valeurs d'intérêt.Comme une complication, sur les lectures suivantes, si vous voulez
fread
via le pointeur tous les 12 bits, on lira seulement un octet, à l'aide de la gauche plus de bits à partir de la précédente lecture de construire une nouvelle valeur 12 bits. Si il n'y a pas des restes, vous auriez besoin de lire deux octets.Votre cartographie des fonctions liées à la nécessité d'aborder le second cas où les bits ont été utilisés à partir de la précédente lecture, parce que les deux octets aurait besoin de mapping. Pour ce faire efficacement, un module sur une lecture de compteur peut être utilisé pour permuter entre les deux démarches.
OriginalL'auteur Alex Reynolds
J'ai mis en place un couple de méthodes pour lire/écrire des fichiers bit par bit. Ici ils sont. Si c'est viable ou pas à votre cas d'utilisation, vous aurez à décider pour vous-même. J'ai essayé de rendre le plus lisible, le code optimisé je pouvais, n'étant pas un inconditionnel de développeur C (pour l'instant).
En interne, il utilise un "bitCursor" pour stocker les informations sur les précédentes bits qui n'est pas encore complet d'un octet. Il a qui des champs de données: d stocke les données et s magasins de taille, ou de la quantité de bits stockés dans le curseur.
Vous ont quatre fonctions:
{0,0}. Tel un curseur est nécessaire au début d'une séquence de
opérations de lecture/écriture ou à partir d'un fichier.
*c), qui écrit sizeb plus à droite les bits de la valeur stockée dans ptr pour fp.
le précédent écrit n'a pas exactement encapsuler toutes les données nécessaires pour
écrire, c'est probablement presque toujours le cas...
*c), qui se lit sizeb bits et bit-à-bit OUs * * ptr. (il est donc de votre responsabilité de init *ptr comme 0)
Plus d'info est fournie dans les commentaires. Amusez-Vous!
Edit: Il est venu à ma connaissance aujourd'hui que lorsque j'ai réalisé que j'ai supposé Petit-Boutiste! 😛 Oups! C'est toujours agréable de constater à quel point d'un noob, je le suis encore ;D.
Edit: GNU Binaire de Descripteurs de Fichiers.
OriginalL'auteur quirinpa
Il y a plusieurs années, j'ai écrit quelques I/O routines en C pour un codeur de Huffman. Ce doit être capable de lire et d'écrire sur la granularité de bits plutôt qu'en octets. J'ai créé des fonctions analogues à read(2) et write(2) qui pourraient être posées à (dire) lire 13 bits à partir d'un flux. Pour coder, par exemple, les octets seraient intégrés dans le codeur et un nombre variable de bits, pourrait émerger de l'autre côté. J'ai eu une structure simple avec un peu pointeur dans le courant de l'octet en cours de lecture ou d'écriture. À chaque fois, il s'en alla à la fin, il rincée à l'achevé d'octets et de réinitialiser le pointeur à zéro. Malheureusement, ce code est depuis longtemps révolu, mais il pourrait être une idée de séparer un open-source codeur de Huffman et de voir comment le problème a été résolu. De même, le codage base64 prend 3 octets de données et les transforme en 4 (ou vice versa).
OriginalL'auteur David G
lire 2 octets et ne peu sage opérations vont le faire pour la prochaine fois lisez 2e octets à partir d'appliquer la bit-wise opérations de revenir vous attend . . . .
OriginalL'auteur sunmoon
Pour votre problème, vous pouvez voir cette démo qui lire 2byte mais l'information n'est que de 12 bits.Ainsi que ce genre de choses, il peu sage d'accès.
fwrite() est une de la bibliothèque standard de la fonction qui prennent la taille de l'argument que l'octet de type int.Donc, il n'est pas possible exactement 12bit lire.Si le fichier que vous créez ensuite créer comme ci-dessous ainsi que de lire comme ci-dessous-il de résoudre votre problème.
Si ce fichier est le fichier spécial de ne pas écrite par vous, puis suivez la norme prévue pour le fichier à lire, je pense qu'ils ont également écrit comme ceci.Ou vous pouvez fournir le axact où je peut vous aider.
OriginalL'auteur rajesh6115