Salve,
il problema nel caso specifico sta nel leggere l'header di un file bmp ed estrapolare le informazioni riguardanti la bitmap.
Il mio problema è strano: leggendo l'header byte per byte, la maggior parte dei campi viene letto in modo corretto, mentre altri vengono letti con valori sbagliati. Mi spiego meglio:
quello che faccio io in pratica è aprire il file bmp in lettura, leggere il campo dell'header che indica il numero dei byte totali dell'header stesso, quindi usare questa informazione per copiare l'intero header in un vettore di char, e scansionare poi questo vettore byte per byte alla ricerca delle informazioni che mi interessano (es: le dimensioni della bitmap, la profondità di colore dei pixel, etc, etc).
Per verificare che l'header fosse stato copiato in maniera corretta nell'array di char, ho fatto un banalissimo ciclo for in cui facevo stampare in squenza tutti i byte come cifre esadecimali, e quindi ho confrontato lo stampato con quello che mi mostra un editor esadecimale.
Ebbene, i due header sembra differiscano solo per alcuni byte, e non riesco proprio a capirne il motivo.
Vi incollo qui di seguito il codice che ho scritto, e i due header, così come me lo mostrano il mio outputo e l'editor esadecimale:
codice:
#include <stdio.h>
#include <math.h>
#include <STDDEF.H>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
void salva_header (char[], char*, int);
int header_lenght (char[]);
int main (int num, char** arg)
{
int offset;
int n;
char* header;
int n_cluster;
offset = header_lenght (arg[1]);
printf("\nL'header sarà lungo %d bytes\n", offset);
header = malloc(offset);
salva_header (arg[1], header, offset);
printf("\nL'header completo del bitmap è dato dai seguenti byte:\n\n");
for(n = 0; n<offset; n++)
printf("%X ", header[n]);
return 0;
}
void salva_header (char nome_file[], char* header, int offset)
{
int a;
FILE* bitmap = fopen(nome_file, "r");
rewind(bitmap);
fread (header, 1, offset, bitmap);
fclose(bitmap);
}
int header_lenght (char nome_file[])
{
int offset;
FILE* bitmap = fopen(nome_file, "r");
fseek (bitmap, 10, 0);
fread (&offset, 4, 1, bitmap);
fclose(bitmap);
return offset;
}
Il mio output:
42 4D FFFFFFE6 71 B 0 0 0 0 0 36 0 0 0 28 0 0 0 FFFFFFF4 1 0 0 FFFFFFF4 1 0 0 1
0 18 0 0 0 0 0 FFFFFFB0 71 B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
L'output dell'editor esadecimale:
42 4D E6 71 0B 00 00 00 00 00 36 00 00 00 28 00 00 00 F4 01 00 00 F4 01 00 00 01 00 18 00 00 00 00 00 B0 71 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Le uniche differenze sono in quelle "FFFFFFF" davanti ai valori del secondo, diciottesimo, ventiduesimo e trentaquattresimo byte. E guardacaso, proprio il diciottesimo ed il trentaduesimo byte sono quelli che indicano le dimensioni del bitmap, che è quello che più mi serve...
Spero possiate darmi una mano.
Grazie a tutti.
Ciao