Я читаю двоичные данные из файла, в частности из zip файла. (Чтобы узнать больше о структуре формата zip, см. http://en.wikipedia.org/wiki/ZIP_%28file_format%29)
Я создал структуру, в которой хранятся данные:
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;
Размер, возвращаемый sizeof(ZIP_local_file_header)
, равен 40, но если сумма каждого поля вычисляется с помощью оператора sizeof
, общий размер равен 38.
Если у нас есть следующая структура:
typedef struct {
short int x;
int y;
} FOO;
sizeof(FOO)
возвращает 8, потому что память распределяется по 4 байта каждый раз. Итак, для выделения x
зарезервированы 4 байта (но реальный размер - 2 байта). Если нам понадобится другой short int
, он заполнит оставшиеся 2 байта предыдущего распределения. Но поскольку у нас есть int
, он будет выделен плюс 4 байта, а пустые 2 байта будут потрачены впустую.
Для чтения данных из файла мы можем использовать функцию fread
:
ZIP_local_file_header p;
fread(&p,sizeof(ZIP_local_file_header),1,file);
Но поскольку в середине есть пустые байты, он не читается правильно.
Что я могу сделать для последовательного и эффективного хранения данных с помощью ZIP_local_file_header
без байтов?