1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| //---------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LENTETE 71
typedef struct
{
unsigned char * data; // les données (ici en alloc dynamique)
int ndata; // le nombre de données
unsigned char entete[LENTETE]; // en-tete du bloc
unsigned char nextentete[LENTETE]; // en-tete du bloc suivant
}Data;
typedef enum {stOK, stEOF ,stENTETE_ERR, stALLOC_ERR} Status;
/*-----------------------------------------------------------------------*/
// Vérification de la validité de l'en-tete
#define maxindice 8 // l'indice max qui est testé dans entete
// utilisé par ChercheEntete()
#define CheckEntete(entete)\
((entete[0] == 0x7F && entete[1] == 0x7F && entete[8] == 0x47)\
? stOK \
: stENTETE_ERR)
/*-----------------------------------------------------------------------*/
Status LireEntete(FILE * f, unsigned char * entete)
{
int i = fread(entete,1,LENTETE,f);
if(i<LENTETE) return stEOF;
return CheckEntete(entete);
}
/*-----------------------------------------------------------------------*/
Status LireData(FILE * f, Data *data)
{
int i ;
unsigned char *p;
data->ndata = data->entete[3]*256+data->entete[2]+2- LENTETE;
p = realloc(data->data,data->ndata);
if(p==NULL) // echec d'allocation
{
free(data->data), data->data = NULL;
data->ndata = 0;
return stALLOC_ERR;
}
data->data = p;
i = fread(data->data,1,data->ndata,f);
return (i< data->ndata)
? stEOF
: stOK ;
}
/*-----------------------------------------------------------------------*/
// recherche un entete dans les données précédemment lues
Status ChercheEntete(FILE * f, Data *data)
{
unsigned char * p = data->data;
int i=0;
do
{
if(CheckEntete(p)== stOK) break;
p++;
i++;
}while(i< data->ndata-maxindice);
if(i==data->ndata-maxindice)return stENTETE_ERR; // pas trouvé
fseek(f,i-data->ndata-LENTETE,SEEK_CUR); // repositionner le fichier
data->ndata = i; // actualiser le nombre de données valides
return LireEntete(f,data->nextentete); // lire l'en-tete suivant
}
/*-----------------------------------------------------------------------*/
int main(void)
{
Data data = {NULL,0};
Status status = stOK;
int count = 0; // compte le nombre de blocs pour info
FILE * f = fopen(....,"rb");
if(f != NULL)
{
status = LireEntete(f,data.nextentete);
if(status != stOK)
{
printf(" Premier en-tete incorrect");
}
while(status == stOK)
{
memcpy(data.entete, data.nextentete, LENTETE);
count ++;
status = LireData(f,&data);
if(status == stOK)
{
// vérifier si le prochain en-tete est correct pour
// établir le nombre correct de data actuels
status = LireEntete(f,data.nextentete);
if(status == stENTETE_ERR) //en tête incorrect. rechercher avant
{
printf("INFO : Erreur en-tete %d %x (ox7F), %x (ox7F), %x (0x47)\n",count+1,data.nextentete[0],data.nextentete[1],data.nextentete[8]);
status = ChercheEntete(f,&data);
if(status != stOK) printf("ERREUR : en-tete non trouvé\n");
}
if(status == stOK)
{
// les données sont prètes
}
}
}
fclose(f);
}
printf("%d blocs de données lues\n", count);
free(data.data);
return 0;
}
//--------------------------------------------------------------------------- |
Partager