Recherche pour Modèle Binaire en C (Lire en tampon de fichier binaire)
Hé là. Je suis en train d'écrire un petit programme qui va lire les quatre octets après la dernière occurrence de "0xFF 0xC0 0x00 0x11" qui peut être facilement converti en binaire ou décimal. Le but est que les 2 à 5 octets à la suite de la dernière occurrence de ce modèle hexagonal représentent la largeur et la hauteur d'un fichier JPEG.
#include <stdio.h>
int main () {
FILE * pFile;
long lSize;
char * buffer;
size_t result;
pFile = fopen ( "pano8sample.jpg" , "rb" );
if(pFile==NULL){
fputs ("File error",stderr);
exit (1);
}
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
printf("\n\nFile is %d bytes big\n\n", lSize);
buffer = (char*) malloc (sizeof(char)*lSize);
if(buffer == NULL){
fputs("Memory error",stderr);
exit (2);
}
result = fread (buffer,1,lSize,pFile);
if(result != lSize){
fputs("Reading error",stderr);
exit (3);
}
//0xFF 0xC0 0x00 0x11 (0x08)
//Logic to check for hex/binary/dec
fclose (pFile);
free (buffer);
return 0;
}
Le problème est que je ne sais pas comment lire le tampon de la mémoire de manière récursive et d'utiliser le plus lu récemment variable comme un int pour comparer avec mon binaire/hexadécimal/dec.
Comment puis-je faire cela?
Vous devez vous connecter pour publier un commentaire.
Si
last_needle
n'est pas null, vous pouvez imprimerlast_needle+4
...memmem()
fonction n'est pas normalisée par POSIX, mais il est disponible sur Linux et AIX, mais pas sur mac os X (10.5) ou Solaris 10.au lieu de lire tout le fichier en mémoire, je voudrais utiliser un peu d'une machine d'état. Mes C est un peu rouillé, mais:
à la fin, vous êtes de gauche avec 5 octets dans lastBytes qui sont les cinq octets juste après la dernière fois que vous trouver searchChars
Personnellement, je préfère utiliser une fonction qui avale un caractère à la fois. La fonction va utiliser une machine à états finis pour faire une simple expression régulière, l'enregistrement des détails dans une soit les variables locales statiques ou d'un bloc de paramètres de la structure. Vous avez besoin de deux sous-blocs - un pour la partie appariés selon l'état, et une pour le dernier match de chaque indiquant les positions pertinentes ou de la valeur en tant que de besoin.
Dans ce cas, vous devriez être en mesure de concevoir manuellement. Pour les besoins plus complexes, regardez Ragel.
Vous pouvez utiliser la fonction fscanf en C/C++ si les données sont codées en ascii. Si ce n'est pas, vous devrez écrire votre propre fonction qui va le faire. Moyen Simple serait de lire N nombre d'octets du fichier, recherchez la chaîne d'octets pour le motif que vous voulez continuer jusqu'à ce que les expressions du FOLKLORE.
Code réellement lit l'intégralité du fichier en une seule fois (inutile si la ligne que vous recherchez se trouve près du haut de la file.) Votre code stocke le fichier sur le tas comme un tableau d'octets (char est équivalent à un octet en C++) avec tampon le pointeur au début de la zone contiguë de tableau dans la mémoire. Manipuler le tableau tampon, comme vous le feriez manipuler tout autre tableau.
Aussi, si vous avez l'intention de faire rien après avoir lu la taille, assurez-vous de libérer la malloced tampon objet afin d'éviter une fuite.