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
| FILE *binary_analyse( const char *path )
{
FILE *f_dst = NULL;
if (path)
{
FILE *f_dst = NULL;
FILE *f_src = NULL;
if ( (f_dst = file_open("D:\\table", "wb")) )
{
/* On travaille avec des unsigned int (4 octets soit 4294967296 valeurs différentes définissant une plage allant de 0 à 4294967295 */
/* Cette boucle génére un fichier de 4294967296 "cases" de 4 octets chacunes */
/* Ce fichier a pour but de stocker la fréquence d'apparition d'une valeur de cette plage à l'offset équivalent */
/* On génère le fichier de 16 Go en l'initialisant avec des 0 */
t_uint64 i=0;
unsigned int j = 0;
for ( i=0 ; i < 4294967296 ; i++)
fwrite(&j, sizeof(unsigned int), 1, f_dst);
file_close(f_dst);
}
else printf("\n%s", strerror(errno));
if ( (f_src = file_open(path, "rb")) && (f_dst = file_open("D:\\table", "ab")) )
{
t_uint64 read_byte, written_byte, total_written_byte=0;
unsigned int buffer_src = 0;
unsigned int buffer_dst = 0;
unsigned int x = 0;
/* Parcourir le fichier à analyser 4 octets par 4 octets, on récupère la valeur décimale équivalente de type unsigned int dans buffer_src */
while (0<(read_byte=fread(&buffer_src, sizeof(unsigned int), 1, f_src)))
{
/* Se Positionner dans le fichier de 16Go à l'offset de la valeur récupérée dans buffer_src */
fseek(f_dst, buffer_src*sizeof(unsigned int), SEEK_SET);
/* Lire cette valeur à l'offset trouvé*/
fread(&buffer_dst, sizeof(unsigned int), 1, f_dst);
/* Incrémenter de 1 la fréquence d'apparition de cette valeur */
x=buffer_dst+1;
/* Repositionner le curseur à l'offset précédent après lecture */
fseek(f_dst, (ftell(f_dst)-1)*sizeof(unsigned int), SEEK_SET);
/* Modifier cette valeur dans le fichier de 16 Go */
fwrite(&x, sizeof(unsigned int), 1, f_dst);
total_written_byte+=read_byte*sizeof(unsigned int);
}
total_written_byte+=read_byte*sizeof(unsigned int);
file_close(f_src);
file_close(f_dst);
t_uint64 f_src_size = file_length(path);
if ( total_written_byte != f_src_size )
printf("\n Erreur taille fichier : %I64u %I64u", f_src_size, total_written_byte );
}
}
return f_dst;
} |
Partager