estoy leyendo los datos binarios de un archivo, en concreto de un archivo zip. (Para saber más sobre la estructura de formato zip ver http://en.wikipedia.org/wiki/ZIP_%28file_format%29)leer datos binarios (de archivo) en una estructura
He creado una estructura que almacena los datos:
typedef struct {
/*Start Size Description */
int signatute; /* 0 4 Local file header signature = 0x04034b50 */
short int version; /* 4 2 Version needed to extract (minimum) */
short int bit_flag; /* 6 2 General purpose bit flag */
short int compression_method; /* 8 2 Compression method */
short int time; /* 10 2 File last modification time */
short int date; /* 12 2 File last modification date */
int crc; /* 14 4 CRC-32 */
int compressed_size; /* 18 4 Compressed size */
int uncompressed_size; /* 22 4 Uncompressed size */
short int name_length; /* 26 2 File name length (n) */
short int extra_field_length; /* 28 2 Extra field length (m) */
char *name; /* 30 n File name */
char *extra_field; /*30+n m Extra field */
} ZIP_local_file_header;
El tamaño devuelto por sizeof(ZIP_local_file_header)
es de 40, pero si la suma de cada campo es calculada con sizeof
operador del tamaño total es de 38.
Si tenemos la siguiente estructura:
typedef struct {
short int x;
int y;
} FOO;
sizeof(FOO)
devuelve 8 porque la memoria está asignada con 4 bytes cada vez. Por lo tanto, para asignar x
se reservan 4 bytes (pero el tamaño real es de 2 bytes). Si necesitamos otro short int
, rellenará los 2 bytes restantes de la asignación anterior. Pero como tenemos un int
, se asignará más 4 bytes y los 2 bytes vacíos se perderán.
para leer datos de archivo, podemos utilizar la función fread
:
ZIP_local_file_header p;
fread(&p,sizeof(ZIP_local_file_header),1,file);
Pero como hay bytes vacíos en el medio, no se lee correctamente.
¿Qué se puede hacer para almacenar de forma secuencial y eficiente de datos con ZIP_local_file_header
perder ningún byte?
http://stackoverflow.com/questions/3913119/dumping-memory-to-file/3913152#3913152 <- posible duplicado –
Pregunta muy bien escrita. –